我尝试在更复杂的算法中实现一个简单的算法。 我想多次调用一个内核,它会在一个数组中递增每个值,让我们在每个调用中说5个。
所以当我最初的数组[1,2,3,4]我想在第一次通话后[6,7,8,9]和第二次通话后的[11,12,13,14]等等上。但是我不知道如何配置我的缓冲区以及如何在这种情况下将缓冲区排入队列。我试着定位本教程: http://www.browndeertechnology.com/docs/BDT_OpenCL_Tutorial_NBody-rev3.html (这是我想要实现的算法,最后进行一些修改) 但是那里使用的图书馆隐藏了最重要的方面。
目前我用:
创建我的缓冲区pos2g_buf = clCreateBuffer(
背景下,
CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, sizeof(cl_float)*(nparticle * 4),
pos2g,
&安培;状态);
内核的调用放在for循环中
for(int i = 0; i
然后我设置内核参数并通过以下方式调用它:
status = clEnqueueNDRangeKernel( oclm->commandQueue, kernel, NDRangeDimension, NULL, globalThreads, localThreads, 0, NULL, &events[0]); //
有人可以帮助我并提供正确的(伪)代码,如何创建我的简单迭代器程序?
非常感谢提前! 迈克尔
答案 0 :(得分:3)
在主持人方面:
cl_mem buffer = clCreateBuffer(..., CL_MEM_READ_WRITE, ...);
cl_kernel kernel = clCreateKernel(...);
clSetKernelArg(.., kernel, buffer, ...);
for(int i=0; i<num_laps; i++){
clEnqueueNDRangeKernel(..., kernel, ...);
}
void *host_mem = malloc(...);
clEnqueueReadBuffer(..., buffer, ..., host_mem, ...);
在设备端:
void __kernel my(global int* mem)
{
mem[get_global_id(0) += 5;
return;
}
不要忘记检查返回代码并释放资源。