Я хочу пройти дерево на GPU с помощью OpenCL, поэтому я собираю дерево в непрерывный блок на хосте и меняю адреса всех указателей, чтобы они были согласованы на устройстве следующим образом:
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" в памяти графического процессора.
Решение очевидное и я не могу его найти? Как мне вернуть указатель на память устройства при создании буферов?