Loops 什么';在循环中对多个opencl内核进行排队的正确顺序

Loops 什么';在循环中对多个opencl内核进行排队的正确顺序,loops,kernel,opencl,Loops,Kernel,Opencl,在循环中对多个opencl内核排队的正确算法是什么? 代码如下: for(int i=0;i<numIter;i++){ // numIter = 1000 // status = clEnqueueNDRangeKernel(commandQueue,kernel1,2,NULL,globalThreads,localThreads,0,NULL,NULL); ASSERT_CL(status); status = clEnqueueNDRangeKernel(commandQueue,

在循环中对多个opencl内核排队的正确算法是什么? 代码如下:

for(int i=0;i<numIter;i++){ // numIter = 1000
//
status = clEnqueueNDRangeKernel(commandQueue,kernel1,2,NULL,globalThreads,localThreads,0,NULL,NULL);
ASSERT_CL(status);
status = clEnqueueNDRangeKernel(commandQueue,kernel2,2,NULL,globalThreads,localThreads,0,NULL,&ndrEvt);
ASSERT_CL(status);
if(i>0 && i%16==0){ // 16 - just
status = clFlush(commandQueue);
ASSERT_CL(status);
spinForEventsComplete( 1, &ndrEvt );
//status = clWaitForEvents(1, &ndrEvt);
//ASSERT_CL(status);
}
}
status = clFlush(commandQueue);
ASSERT_CL(status);
spinForEventsComplete( 1, &ndrEvt );
for(inti=0;i0&&i%16==0){//16-just
状态=clFlush(命令队列);
断言(身份);
spinForEventsComplete(1和ndrEvt);
//状态=clWaitForEvents(1和ndrEvt);
//断言(身份);
}
}
状态=clFlush(命令队列);
断言(身份);
spinForEventsComplete(1和ndrEvt);
还是应该在每次ClenqueEndRangeKernel调用后使用wait


谢谢大家!

我看不出你做了什么错事。你有没有试过在每次NDRange之后等待?你有没有试过一点也不等待,把所有的数据都排好?这两种选择对你更合适吗?

这在很大程度上取决于你的内核有多大。如果它们需要很长时间运行,那么主机上的大量等待可能并不重要。如果它们很小,您可能希望将大量它们排队,以减少每次启动的开销

我很自然地编写了这个循环,不需要等待到最后,但可能每隔几次迭代就插入刷新。刷新的频率取决于体系结构,也是一个很好的调优参数


我也倾向于编写具有所有事件依赖性的代码,这是一个好习惯,即使您的代码可以愉快地依赖于顺序队列。

Thanx,我正在尝试不同的变量,有/没有等待,问题是结果不稳定,两个内核在全局内存中交换数据,但有时在最终缓冲区中交换错误数据。内核非常简单,只是计算,没有本地内存,没有内部循环,没有障碍。不同的内核调用可能会覆盖以前的结果。每次等待一个NDRange时,是否仍存在最终数据问题?是的,任何带有或不带有等待的变体,都没有稳定的工作。我正在使用amd应用程序sdk 3.0 betta