clSetKernelArg arg_value кроме объекта памяти - PullRequest
1 голос
/ 27 февраля 2012

Могу ли я установить аргумент ядра в OpenCL следующим образом?

cl_uint a = 0;
kernel.setArg(0, sizeof(a), &a);

Я хочу читать и записывать одно значение из / в функцию ядра, а не только в запись.

Ответы [ 3 ]

4 голосов
/ 27 февраля 2012

Установка аргумента ядра таким образом может использоваться только для входов в ядро. Любой вывод, который вы хотите прочитать (либо в последующем ядре, либо в программе хоста), должен быть записан в буфер или образ. В вашем случае это означает, что вам нужно создать одноэлементный буфер и передать его ядру.

Один из способов думать об этом заключается в том, что когда вы вызываете setArg с параметром & a, ядро ​​OpenCL использует значение для a, а не расположение для a. Если ядро ​​должно было записать в ноль аргумент ядра, ваша хост-программа не сможет восстановить записанное значение.

2 голосов
/ 27 февраля 2012

Ваш код создает аргумент типа unsigned int, а не указатель на unsigned int. clSetKernelArg принимает указатель на значение аргумента , а не само значение. Если вы хотите передать аргумент-указатель, вам нужно будет создать буфер с clCreateBuffer (даже если там только одно значение) и вызвать clSetKernelArg с полученным cl_mem.

Следующий код создает буфер для 1 cl_uint в __ global памяти и копирует в него значение my_value. После запуска ядра оно копирует (возможно измененное) значение обратно в my_value.

cl_uint my_value = 0;
const unsigned int count = 1;
// Allocate buffer
cl_mem hDeviceMem = clCreateBuffer(hContext, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, count * sizeof(cl_uint), &my_value, &nError);
// Set pointer to buffer as argument
clSetKernelArg(hKernel, 0, sizeof(cl_mem), &hDeviceMem);
// Run kernel
clEnqueueNDRangeKernel(...);
// Copy values back
clEnqueueReadBuffer(hCmdQueue, hDeviceMem, CL_TRUE, 0, count * sizeof(cl_uint), &my_value, 0, NULL, NULL);

Тогда ваше ядро ​​должно выглядеть так:

__kernel void myKernel(__global unsigned int* value)
{
    // read/write to *value here
}
0 голосов
/ 27 февраля 2012

Это должно работать так же, как отправка вектора 1 длины в качестве параметра. Возможно, вам придется использовать __global uint aParam в определении вашего ядра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...