【发布时间】:2014-01-31 17:24:40
【问题描述】:
我有一个问题,我需要并行处理已知数量的线程(很好),但是每个线程可能有非常不同数量的内部迭代(不是很好)。在我看来,这样做内核方案会更好:
__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();
}
根据这个讨论,这必然会在 glIDy 的 FULL POSSIBLE RANGE 范围内执行,而无法提前终止:
我似乎无法找到有关内核中动态大小的 forloops / do-while 语句成本的任何具体信息,尽管我确实在 Nvidia 和 AMD 的 SDK 的内核中到处都能看到它们。我记得读过一些关于内核内条件分支越不周期性,性能越差的内容。
实际问题:
有没有比我提出的第一个方案更有效的方法在 GPU 架构上处理这个问题?
我也愿意接受有关此主题的一般信息。
谢谢。
【问题讨论】:
-
假设 x 维度为您提供了足够的并行度,您在可变大小维度上循环的方法应该没问题。请注意,整体内核时间将由运行时间最长的循环决定。如果您可以生成足够多的线程,或者如果您有其他并发内核可以开始使用从快速线程组中释放的资源,这可能会很好。