| 200 | } |
| 201 | |
| 202 | void TensorTools::copy_elements(Tensor& v, const Tensor& v_src) { |
| 203 | if (v.device->type == DeviceType::CPU) { |
| 204 | if (v_src.device->type == DeviceType::CPU) { |
| 205 | memcpy(v.v, v_src.v, sizeof(real) * v.d.size()); |
| 206 | #if HAVE_CUDA |
| 207 | } else if (v_src.device->type == DeviceType::GPU) { |
| 208 | CUDA_CHECK(cudaSetDevice(((Device_GPU*)v_src.device)->cuda_device_id)); |
| 209 | cudaMemcpyAsync(v.v, v_src.v, sizeof(real) * v.d.size(), cudaMemcpyDeviceToHost); |
| 210 | #endif |
| 211 | } else { throw std::runtime_error("Bad device type"); } |
| 212 | #if HAVE_CUDA |
| 213 | } else if (v.device->type == DeviceType::GPU) { |
| 214 | if (v_src.device->type == DeviceType::CPU) { |
| 215 | CUDA_CHECK(cudaSetDevice(((Device_GPU*)v.device)->cuda_device_id)); |
| 216 | cudaMemcpyAsync(v.v, v_src.v, sizeof(real) * v.d.size(), cudaMemcpyHostToDevice); |
| 217 | } else { |
| 218 | if (v.device == v_src.device) { |
| 219 | CUDA_CHECK(cudaSetDevice(((Device_GPU*)v.device)->cuda_device_id)); |
| 220 | cudaMemcpyAsync(v.v, v_src.v, sizeof(real) * v.d.size(), cudaMemcpyDeviceToDevice); |
| 221 | } else { |
| 222 | cudaMemcpyPeerAsync(v.v, ((Device_GPU*)v.device)->cuda_device_id, |
| 223 | v_src.v, ((Device_GPU*)v_src.device)->cuda_device_id, |
| 224 | sizeof(real) * v.d.size()); |
| 225 | } |
| 226 | } |
| 227 | #endif |
| 228 | } else { throw std::runtime_error("Bad device type"); } |
| 229 | } |
| 230 | |
| 231 | void TensorTools::zero(Tensor& d) { |
| 232 | #if HAVE_CUDA |