有没有办法做这样的事情。
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 稍后会重复使用,因此不能选择传输回主机。
编辑我的谷歌技能让我失望了。
但是我通过查看 cl.h 找到了答案。clCreateSubBuffer
是答案。还没有答案。因此,我将使用示例代码接受第一个答案clCreateSubBuffer()
。