在CUDA中,我们可以通过主机内存的设备侧指针实现从主机内存到设备共享内存的内核管理数据传输。就像这样:
在上面的例子中,内核代码可以通过
但在OpenCL中似乎是不可能的?(在OpenCL中,本地内存是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中共享内存的对应物)