@@ -2,7 +2,7 @@ module RecursiveArrayToolsFastBroadcastExt
22
33using RecursiveArrayTools
44using FastBroadcast
5- using FastBroadcast: Serial
5+ using FastBroadcast: Serial, Threaded
66using StaticArraysCore
77
88const AbstractVectorOfSArray = AbstractVectorOfArray{
@@ -27,4 +27,32 @@ const AbstractVectorOfSArray = AbstractVectorOfArray{
2727 return dst
2828end
2929
30+ @inline function FastBroadcast. fast_materialize! (
31+ :: Threaded , dst:: AbstractVectorOfSArray ,
32+ bc:: Broadcast.Broadcasted{S}
33+ ) where {S}
34+ if FastBroadcast. use_fast_broadcast (S)
35+ Threads. @threads for i in 1 : length (dst. u)
36+ unpacked = RecursiveArrayTools. unpack_voa (bc, i)
37+ dst. u[i] = StaticArraysCore. similar_type (dst. u[i])(
38+ unpacked[j]
39+ for j in eachindex (unpacked)
40+ )
41+ end
42+ else
43+ Broadcast. materialize! (dst, bc)
44+ end
45+ return dst
46+ end
47+
48+ # Fallback for non-SArray VectorOfArray: the generic threaded path splits
49+ # along the last axis via views, which does not correctly partition work for
50+ # VectorOfArray. Fall back to serial broadcasting.
51+ @inline function FastBroadcast. fast_materialize! (
52+ :: Threaded , dst:: AbstractVectorOfArray ,
53+ bc:: Broadcast.Broadcasted
54+ )
55+ return FastBroadcast. fast_materialize! (Serial (), dst, bc)
56+ end
57+
3058end # module
0 commit comments