在CUDA中,我们可以通过主机内存的设备端指针来实现从主机内存到设备共享内存的内核管理数据传输。像这样:
int *a,*b,*c; // host pointers
int *dev_a, *dev_b, *dev_c; // device pointers to host memory
…
cudaHostGetDevicePointer(&dev_a, a, 0); // mem. copy to device not need now, but ptrs needed instead
cudaHostGetDevicePointer(&dev_b, b, 0);
cudaHostGetDevicePointer(&dev_c ,c, 0);
…
//kernel launch
add<<<B,T>>>(dev_a,dev_b,dev_c);
// dev_a, dev_b, dev_c are passed into kernel for kernel accessing host memory directly.
在上面的例子中,内核代码可以通过dev_a
,dev_b
和访问主机内存dev_c
。内核可以利用这些指针直接将数据从主机移动到共享内存,而无需通过全局内存中继它们。
但似乎这在 OpenCL 中是不可能完成的任务?(OpenCL 中的本地内存相当于 CUDA 中的共享内存)