2013-10-14 32 views
0

我正在使用pyopencl在512 x 512(262,144像素)图像中查找某个像素。我开始(512,512),当我运行我的程序并将像素的邻居与一组已知的邻居进行比较时。我在做图像合成。如果我在内核中找到我的像素组,我不想等剩下的内核运行。有没有办法用内核程序来终止正在运行的其他内核?如果我找到我的答案,我该如何停止所有262,144内核

感谢 添

+0

我认为你所谓的“内核”有问题。你的意思是当工作项目有结果时你想停止正在进行的内核吗? – DarkZeros

回答

0

起初以为有某种每个内核可以读取和设置全局内存标志。这种方法需要原子性,所以请确保使用atomic_函数。

__kernel void t(__global int *Data, 
       __global int *Flag){ 
     if(atomic_max(*Flag, 0) == 0){ 
      //perform calc on Data 
      if(PixelsFound){ 
       //Set the flag to +1 
       *Flag = atomic_inc(*Flag); 
      } 
     } 
} 

社区,随时评论,如果这是已知的不工作!

+1

它可能会工作,但它会很慢。 – Dithermaster

0

你的问题是一个大问题和并行性问题。

What to do when one of your parallel threads has already the answer to the problem? 

OpenCL不允许控制内核执行。即使在主机级别。这是一个很大的问题。然而,它是如何发生的,因为如果工作项目不能自由地分离,那么它不是完全平行的。

唯一的解决方案是将计算拆分成小部分并检查每个部分的完成情况。但是,有时这些部件已经非常小(就像你的情况512x512相当小)。

在您的具体情况下,我会处理所有内容(512x512),之后我会使用另一个内核从512x512集合中获取最终结果。

1

当你将一个内核与许多工作项目排队在一起时,它被分成工作组和线程,这些工作组和线程使GPU保持繁忙。真正大的全球大小会尽可能多地开始线程,并在旧线程完成时发布新线程。因此,您可以找到仍然表现良好的最小全局大小,并对其中的许多(而不是一个较大的)进行排队,还可以检查之前排队的结果(使用事件来了解它们何时完成,以及回读内存以获得他们的结果)。当你得到正确的答案时,停止排队核心。

因此,不是这样的:

queue entire job (say, 4096 x 4906) 

做:

do 
{ 
    queue some work (say, 32 x 32) 
    check if any of the prior work queued is done and check if it got the answer 
} 
while (no more work OR answer found) 

你需要的小作业的规模和检查他们的结果与开销之间找出正确的权衡额外的工作完成。

相关问题