2012-02-27 48 views

回答

4

這種方式設置內核參數只能用於輸入內核。您想要讀取的任何輸出(在後續內核或主機程序中)都必須寫入緩衝區或圖像。就你而言,這意味着你需要創建一個單元素緩衝區並將緩衝區傳遞給內核。想想這個

的一種方法是,當你調用setArg與參數&一個,OpenCL的內核使用值的,一個不位置。如果內核要寫入內核參數零,主機程序將無法恢復寫入的值。

+0

謝謝你的回答。我將使用cl :: Buffer。 – aokomoriuta 2012-02-29 18:22:19

0

這應該與發送一個長度爲1的向量相同。您可能必須在內核定義中使用__global uint aParam。

2

您的代碼創建類型爲unsigned int的參數,而不是指向unsigned intclSetKernelArg需要指向參數值的指針,而不是值本身。 如果您想傳遞指針參數,則必須創建一個包含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 
} 
+0

代替clSetKernelArg(hKernel,0,的sizeof(cl_mem),hDeviceMem);它應該是clSetKernelArg(hKernel,0,的sizeof(cl_mem),(無效*)&hDeviceMem)從任何指針 – Ashwin 2014-10-01 05:59:07

+0

轉換爲空指針是隱式在C和C++ – pezcode 2014-10-01 13:09:31