在还原期间终止非活动线程

时间:2011-02-01 17:46:34

标签: cuda

我见过的大部分缩减都是这样的:

for( i = N; i > 0; i /=2 ) {
    if( tid < i )
        assign-shared;
    __syncthreads();
}
if( tid == 0 )
    copy-value-to-global;

我刚刚将其改为:

for( i = N; i > 0; i /= 2 ) {
    if( tid >= i )
        return;
    assign-shared;
    __syncthreads();
}
copy-value-to-global;

并注意到了显着的性能优势。让早期不再涉及减少返回的线程有任何缺点吗?

2 个答案:

答案 0 :(得分:1)

由于您已经使用原始代码执行了if语句,因此我没有看到任何缺陷。

如果if语句的结果没有空间局部性(通常在整个块中的结果相同),您可能看不到任何加速。此外,加速可能取决于您的设备的功能:早期的CUDA设备可能无法提供性能提升。

答案 1 :(得分:1)

第二个代码段提供了更好的性能,因为未使用的warp不需要返回并执行分支检查。

理想情况下,在第二种情况下,您将每次迭代退出一次warp,从而减少GPU上的负载。