我正在使用pyopencl来查找512 x 512(262,144像素)图像中的某个像素。我正在启动(512,512),当我运行我的程序并将像素的邻居与一组已知的邻居进行比较时。我在做图像合成。如果我在内核中找到我的像素组,我不想等待剩余的内核运行。有没有办法用内核程序终止其余正在运行的内核?
由于 添
答案 0 :(得分: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)
您需要找出较小作业的大小与检查结果与完成额外工作的开销之间的正确权衡。
答案 1 :(得分: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);
}
}
}
社区,如果知道这不起作用,请随时发表评论!
答案 2 :(得分:0)
你的问题是一个大问题和并行问题。
What to do when one of your parallel threads has already the answer to the problem?
OpenCL不允许控制内核执行。甚至没有在主机级别。这是一个大问题。然而,它是如何必须的,因为,如果工作项不能自由地彼此分离,那么它就不是完全平行的。
唯一的解决方案是将计算分成小部分并检查每个部分的完成情况。但是,有时部件已经很小(就像在你的情况下512x512非常小)。
在你的具体情况下,我将处理所有内容(512x512),之后我将使用另一个内核从512x512集中获取最终结果。