2012-08-22 53 views
0

有沒有辦法做到這一點。OpenCL中的內存偏移量

int length = 1000; 
float *h_input = new float[length * 100]; 
size_t bytes = length * 100 * sizeof(float); 
cl_mem m_input = clCreateBuffer(context, CL_MEM_READ_WRITE, bytes, NULL, &err); 
cl_mem m_output = clCreateBuffer(context, CL_MEM_READ_WRITE, bytes, NULL, &err); 
clEnqueueReadBuffer (queue, m_input, true, 0, bytes, h_input, 0, NULL, NULL); 
for (int i = 0; i < 100; i++) 
{ 
some_function(length, m_input + i, m_output + i); 
} 

我已經做了一些天真的測試,它似乎並沒有工作。這是我得到的錯誤。

invalid use of incomplete type 'struct _cl_mem' 

除了將i作爲額外參數傳遞給我之外,還有其他解決方法嗎?引入額外參數需要將上游代碼一直更改爲內核。

編輯爲了清晰起見,添加了更多信息。

m_input的偏移量可以通過做clEnqueueReadBuffer以及適當的偏移量(即使它可能比單次調用成本高)來解決。但是,m_output稍後會重用,因此不能將其傳回主機。

編輯我的Google技巧讓我失望。

但我通過查看cl.h找到了答案。 clCreateSubBuffer就是答案。目前還沒有答案。所以我會用clCreateSubBuffer()接受示例代碼的第一個答案。

+0

假設你正在編寫主機代碼,而不是內核,你需要映射內存,然後使用映射的指針。 'cl_mem'是一個句柄,而不是指向實際內存的指針。 – Flexo

+0

@flexo,爲了清晰起見,添加了更多信息。你能詳細說明可以做些什麼嗎? – ashokk

+1

這段代碼究竟在做什麼?你有輸入和輸出緩衝區和句柄和指針混合起來 - 現在沒有任何意義。 –

回答

0

我通過查看cl.h找到了答案。 clCreateSubBuffer就是答案。目前還沒有答案。所以我會用clCreateSubBuffer()接受示例代碼的第一個答案。