在OpenCL中,我可以如下設置內核參數嗎?clSetKernelArg內存對象以外的arg_value
cl_uint a = 0;
kernel.setArg(0, sizeof(a), &a);
我想讀&寫一個從/到一個內核函數值,而不是隻寫。
在OpenCL中,我可以如下設置內核參數嗎?clSetKernelArg內存對象以外的arg_value
cl_uint a = 0;
kernel.setArg(0, sizeof(a), &a);
我想讀&寫一個從/到一個內核函數值,而不是隻寫。
這種方式設置內核參數只能用於輸入內核。您想要讀取的任何輸出(在後續內核或主機程序中)都必須寫入緩衝區或圖像。就你而言,這意味着你需要創建一個單元素緩衝區並將緩衝區傳遞給內核。想想這個
的一種方法是,當你調用setArg與參數&一個,OpenCL的內核使用值的,一個不位置。如果內核要寫入內核參數零,主機程序將無法恢復寫入的值。
這應該與發送一個長度爲1的向量相同。您可能必須在內核定義中使用__global uint aParam。
您的代碼創建類型爲unsigned int
的參數,而不是指向unsigned int
。 clSetKernelArg
需要指向參數值的指針,而不是值本身。 如果您想傳遞指針參數,則必須創建一個包含clCreateBuffer
(即使其中只有一個值)的緩衝區,並使用cl_mem
調用clSetKernelArg
。
下面的代碼在__global存儲器創建1 cl_uint
的緩衝器,並且拷貝的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
}
謝謝你的回答。我將使用cl :: Buffer。 – aokomoriuta 2012-02-29 18:22:19