在循环

时间:2015-05-08 15:19:32

标签: 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,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 );

或者应该在每次clEnqueueNDRangeKernel调用后使用wait?

谢谢!

2 个答案:

答案 0 :(得分:0)

我没有看到你做错了什么。您是否尝试过在每个NDRange之后等待?你有没有尝试过等待所有NDRanges排队?这两种替代方案对你有用吗?

答案 1 :(得分:0)

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

我自然会在没有任何等待的情况下编写该循环,直到最后,但是可能每隔几次迭代就插入flush。您想要刷新的频率将依赖于体系结构和一个很好的调整参数。

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