2
2
3
3
Base. map (f, d:: DArray ) = DArray (I-> map (f, localpart (d)), d)
4
4
5
- Base. map! {F} (f:: F , d :: DArray ) = begin
6
- @sync for p in procs (d )
7
- @async remotecall_fetch ((f,d) -> (map! (f, localpart (d)) ; nothing ), p, f, d )
5
+ Base. map! {F} (f:: F , dest :: DArray , src :: DArray ) = begin
6
+ @sync for p in procs (dest )
7
+ @async remotecall_fetch (() -> (map! (f, localpart (dest), src[ localindexes (dest) ... ]) ; nothing ), p)
8
8
end
9
- return d
9
+ return dest
10
10
end
11
11
12
- # FixMe! We'll have to handle the general n args case but it seems tricky
13
- Base. broadcast (f, d:: DArray ) = DArray (I -> broadcast (f, localpart (d)), d)
12
+ Base. Broadcast. containertype {D<:DArray} (:: Type{D} ) = DArray
13
+
14
+ Base. Broadcast. promote_containertype (:: Type{DArray} , :: Type{DArray} ) = DArray
15
+ Base. Broadcast. promote_containertype (:: Type{DArray} , :: Type{Array} ) = DArray
16
+ Base. Broadcast. promote_containertype (:: Type{DArray} , ct) = DArray
17
+ Base. Broadcast. promote_containertype (:: Type{Array} , :: Type{DArray} ) = DArray
18
+ Base. Broadcast. promote_containertype (ct, :: Type{DArray} ) = DArray
19
+
20
+ Base. Broadcast. broadcast_indices (:: Type{DArray} , A) = indices (A)
21
+ Base. Broadcast. broadcast_indices (:: Type{DArray} , A:: Ref ) = ()
22
+
23
+ # FixMe!
24
+ # # 1. Support for arbitrary indices including OneTo
25
+ # # 2. This is as type unstable as it can be. Overhead might not matter too much for DArrays though.
26
+ function Base. Broadcast. broadcast_c (f, :: Type{DArray} , As... )
27
+ T = Base. Broadcast. _broadcast_eltype (f, As... )
28
+ shape = Base. Broadcast. broadcast_indices (As... )
29
+ iter = Base. CartesianRange (shape)
30
+ D = DArray (map (length, shape)) do I
31
+ Base. Broadcast. broadcast_c (f, Array,
32
+ map (a -> isa (a, Union{Number,Ref}) ? a :
33
+ localtype (a)(a[ntuple (i -> i > ndims (a) ? 1 : (size (a, i) == 1 ? (1 : 1 ) : I[i]), length (shape))... ]), As)... )
34
+ end
35
+ return D
36
+ end
14
37
15
38
function Base. reduce (f, d:: DArray )
16
39
results= []
@@ -148,15 +171,17 @@ end
148
171
# Unary vector functions
149
172
(- )(D:: DArray ) = map (- , D)
150
173
151
- # scalar ops
152
- (+ )(A:: DArray{Bool} , x:: Bool ) = A .+ x
153
- (+ )(x:: Bool , A:: DArray{Bool} ) = x .+ A
154
- (- )(A:: DArray{Bool} , x:: Bool ) = A .- x
155
- (- )(x:: Bool , A:: DArray{Bool} ) = x .- A
156
- (+ )(A:: DArray , x:: Number ) = A .+ x
157
- (+ )(x:: Number , A:: DArray ) = x .+ A
158
- (- )(A:: DArray , x:: Number ) = A .- x
159
- (- )(x:: Number , A:: DArray ) = x .- A
174
+ @static if VERSION < v " 0.6.0-dev.1731"
175
+ # scalar ops
176
+ (+ )(A:: DArray{Bool} , x:: Bool ) = A .+ x
177
+ (+ )(x:: Bool , A:: DArray{Bool} ) = x .+ A
178
+ (- )(A:: DArray{Bool} , x:: Bool ) = A .- x
179
+ (- )(x:: Bool , A:: DArray{Bool} ) = x .- A
180
+ (+ )(A:: DArray , x:: Number ) = A .+ x
181
+ (+ )(x:: Number , A:: DArray ) = x .+ A
182
+ (- )(A:: DArray , x:: Number ) = A .- x
183
+ (- )(x:: Number , A:: DArray ) = x .- A
184
+ end
160
185
161
186
map_localparts (f:: Callable , d:: DArray ) = DArray (i-> f (localpart (d)), d)
162
187
map_localparts (f:: Callable , d1:: DArray , d2:: DArray ) = DArray (d1) do I
@@ -192,10 +217,12 @@ end
192
217
# the same size and distribution
193
218
map_localparts (f:: Callable , As:: DArray... ) = DArray (I-> f (map (localpart, As)... ), As[1 ])
194
219
195
- for f in (:.+ , :.- , :.* , :./ , :.% , :.<< , :.>> , :div , :mod , :rem , :& , :| , :$ )
196
- @eval begin
197
- ($ f){T}(A:: DArray{T} , B:: Number ) = map_localparts (r-> ($ f)(r, B), A)
198
- ($ f){T}(A:: Number , B:: DArray{T} ) = map_localparts (r-> ($ f)(A, r), B)
220
+ @static if VERSION < v " 0.6.0-dev.1632"
221
+ for f in (:.+ , :.- , :.* , :./ , :.% , :.<< , :.>> , :div , :mod , :rem , :& , :| , :$ )
222
+ @eval begin
223
+ ($ f){T}(A:: DArray{T} , B:: Number ) = map_localparts (r-> ($ f)(r, B), A)
224
+ ($ f){T}(A:: Number , B:: DArray{T} ) = map_localparts (r-> ($ f)(A, r), B)
225
+ end
199
226
end
200
227
end
201
228
@@ -217,13 +244,15 @@ for f in (:+, :-, :div, :mod, :rem, :&, :|, :$)
217
244
($ f){T}(A:: Array{T} , B:: DArray{T} ) = map_localparts ($ f, A, B)
218
245
end
219
246
end
220
- for f in (:.+ , :.- , :.* , :./ , :.% , :.<< , :.>> )
221
- @eval begin
222
- function ($ f){T}(A:: DArray{T} , B:: DArray{T} )
223
- map_localparts ($ f, A, B)
247
+ @static if VERSION < v " 0.6.0-dev.1632"
248
+ for f in (:.+ , :.- , :.* , :./ , :.% , :.<< , :.>> )
249
+ @eval begin
250
+ function ($ f){T}(A:: DArray{T} , B:: DArray{T} )
251
+ map_localparts ($ f, A, B)
252
+ end
253
+ ($ f){T}(A:: DArray{T} , B:: Array{T} ) = map_localparts ($ f, A, B)
254
+ ($ f){T}(A:: Array{T} , B:: DArray{T} ) = map_localparts ($ f, A, B)
224
255
end
225
- ($ f){T}(A:: DArray{T} , B:: Array{T} ) = map_localparts ($ f, A, B)
226
- ($ f){T}(A:: Array{T} , B:: DArray{T} ) = map_localparts ($ f, A, B)
227
256
end
228
257
end
229
258
0 commit comments