我想用OpenCL在 GPU 上遍历树,所以我将树组装在主机的一个连续块中,并更改所有指针的地址,以便在设备上保持一致,如下所示:
TreeAddressDevice = (size_t)BaseAddressDevice + ((size_t)TreeAddressHost - (size_t)BaseAddressHost);
我想要内存缓冲区的基地址:在主机上,我为缓冲区分配内存,如下所示: cl_mem tree_d = clCreateBuffer(...);
问题是 cl_mems 是跟踪数据内部表示的对象。从技术上讲,它们是指向对象的指针,但它们不是指向数据的指针。从内核中访问 cl_mem 的唯一方法是通过 setKernelArgs 将其作为参数传入。
在这里http://www.proxya.net/browse.php?u=%3A%2F%2Fwww.khronos.org%2Fmessage_boards%2Fviewtopic.php%3Ff%3D37%26amp%3Bt%3D2900&b=28我找到了以下解决方案,但它不起作用:
__kernel void getPtr( __global void *ptr, __global void *out )
{
*out = ptr;
}
可以如下调用
代码:
...
cl_mem auxBuf = clCreateBuffer( context, CL_MEM_READ_WRITE, sizeof(void*), NULL, NULL );
void *gpuPtr;
clSetKernelArg( getterKernel, 0, sizeof(cl_mem), &myBuf );
clSetKernelArg( getterKernel, 1, sizeof(cl_mem), &auxBuf );
clEnqueueTask( commandQueue, getterKernel, 0, NULL, NULL );
clEnqueueReadBuffer( commandQueue, auxBuf, CL_TRUE, 0, sizeof(void*), &gpuPtr, 0, NULL, NULL );
clReleaseMemObject(auxBuf);
...
现在“gpuPtr”应该包含“myBuf”在GPU内存空间中的开头地址。
解决方案很明显,我找不到?创建缓冲区时如何取回指向设备内存的指针?