88
88
89
89
# # basic linear copies of identically-typed memory
90
90
91
+ # convert to something we can get a pointer to
91
92
materialize (x:: AbstractArray ) = Array (x)
92
93
materialize (x:: GPUArray ) = x
94
+ materialize (x:: Array ) = x
95
+
96
+ # TODO : do we want to support `copyto(..., WrappedArray{GPUArray})`
97
+ # if so (does not work due to lack of copy constructors):
98
+ # for (W, ctor) in (:AT => (A,mut)->mut(A), Adapt.wrappers...)
99
+ # @eval begin
100
+ # materialize(X::$W) where {AT <: GPUArray} = AT(X)
101
+ # end
102
+ # end
93
103
94
104
for (D, S) in ((GPUArray, AbstractArray), (Array, GPUArray), (GPUArray, GPUArray))
95
105
@eval begin
@@ -102,14 +112,14 @@ for (D, S) in ((GPUArray, AbstractArray), (Array, GPUArray), (GPUArray, GPUArray
102
112
103
113
function Base. copyto! (dest:: $D{T} , d_range:: CartesianIndices{1} ,
104
114
src:: $S{T} , s_range:: CartesianIndices{1} ) where T
105
- amount = length (d_range)
106
- if length (s_range) != amount
107
- throw (ArgumentError (" Copy range needs same length. Found: dest: $amount , src: $(length (s_range)) " ))
115
+ len = length (d_range)
116
+ if length (s_range) != len
117
+ throw (ArgumentError (" Copy range needs same length. Found: dest: $len , src: $(length (s_range)) " ))
108
118
end
109
- amount == 0 && return dest
119
+ len == 0 && return dest
110
120
d_offset = first (d_range)[1 ]
111
121
s_offset = first (s_range)[1 ]
112
- copyto! (dest, d_offset, materialize (src), s_offset, amount )
122
+ copyto! (dest, d_offset, materialize (src), s_offset, len )
113
123
end
114
124
115
125
function Base. copyto! (dest:: $D{T, N} , src:: $S{T, N} ) where {T, N}
0 commit comments