| 36 | |
| 37 | template<typename T> |
| 38 | Array<T> copyArray(const Array<T> &src) { |
| 39 | Array<T> out = createEmptyArray<T>(src.dims()); |
| 40 | if (src.elements() > 0) { |
| 41 | if (src.isReady()) { |
| 42 | if (src.isLinear()) { |
| 43 | CUDA_CHECK(cudaMemcpyAsync( |
| 44 | out.get(), src.get(), src.elements() * sizeof(T), |
| 45 | cudaMemcpyDeviceToDevice, getActiveStream())); |
| 46 | } else { |
| 47 | kernel::memcopy<T>(out, src, src.ndims()); |
| 48 | } |
| 49 | } else { |
| 50 | evalNodes<T>(out, src.getNode().get()); |
| 51 | } |
| 52 | } |
| 53 | return out; |
| 54 | } |
| 55 | |
| 56 | template<typename T> |
| 57 | void multiply_inplace(Array<T> &src, double norm) { |
no test coverage detected