我有一个问题,我需要处理已知数量的线程并行(很好),但每个线程可能有大量不同数量的内部迭代(不是很好) 。在我看来,这使得它更好地做到这样的核心方案:OpenCL - 矢量化与线程内循环
__kernel something(whatever)
{
unsigned int glIDx = get_global_id(0);
for(condition_from_whatever)
{
}//alternatively, do while
}
其中id(0)预先知道,而不是:
__kernel something(whatever)
{
unsigned int glIDx = get_global_id(0);
unsigned int glIDy = get_global_id(1); // max "unroll dimension"
if(glIDy_meets_condition)
do_something();
else
dont_do_anything();
}
这将必然执行的FULL可能的glIDy的范围内,没有办法提前终止,每这场讨论是:
我似乎无法找到有关的任何具体信息尽管我在Nvidia和AMD的SDK中的内核中都看到了它们,但它们在内核中的动态大小的forloop/do-while语句的成本。我记得读过一些关于核内条件分支越是非周期性的事情,性能越差。
实际问题:
有没有对付这种在GPU架构比我提出的第一种方案更有效的方法?
我也对此主题的一般信息开放。
谢谢。
假设x尺寸给了你足够的平行度,你在循环变化尺寸的方法应该没问题。请注意,整个内核时间将由最长运行循环决定。如果您可以生成足够的线程,或者如果您有其他可以使用从快速线程组释放的资源开始的并发内核,这可能会很好。 –