22
33Base. map (f, d:: DArray ) = DArray (I-> map (f, localpart (d)), d)
44
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)
88 end
9- return d
9+ return dest
1010end
1111
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
1437
1538function Base. reduce (f, d:: DArray )
1639 results= []
@@ -148,15 +171,17 @@ end
148171# Unary vector functions
149172(- )(D:: DArray ) = map (- , D)
150173
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
160185
161186map_localparts (f:: Callable , d:: DArray ) = DArray (i-> f (localpart (d)), d)
162187map_localparts (f:: Callable , d1:: DArray , d2:: DArray ) = DArray (d1) do I
@@ -192,10 +217,12 @@ end
192217# the same size and distribution
193218map_localparts (f:: Callable , As:: DArray... ) = DArray (I-> f (map (localpart, As)... ), As[1 ])
194219
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
199226 end
200227end
201228
@@ -217,13 +244,15 @@ for f in (:+, :-, :div, :mod, :rem, :&, :|, :$)
217244 ($ f){T}(A:: Array{T} , B:: DArray{T} ) = map_localparts ($ f, A, B)
218245 end
219246end
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)
224255 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)
227256 end
228257end
229258
0 commit comments