1

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

谢谢蒂姆

4

3 回答 3

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)

您需要在较小工作的规模和检查其结果的开销与完成的额外工作之间做出正确的权衡。

于 2013-10-16T18:55:00.987 回答
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);
          }
      }
 }

社区,如果知道这不起作用,请随时发表评论!

于 2013-10-14T02:07:45.070 回答
0

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

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

OpenCL 不允许控制内核执行。甚至在主机级别也不行。这是一个大问题。然而它必须是这样,因为如果工作项目不能自由地运行,那么它就不是完全平行的。

唯一的解决方案是将计算分成小部分并检查每个部分的完成情况。但是,有时这些部分已经非常小(比如在你的情况下 512x512 非常小)。

在您的特定情况下,我将处理所有内容(512x512),之后我将使用另一个内核从 512x512 集中获得最终结果。

于 2013-10-14T12:09:36.207 回答