我见过的大部分缩减都是这样的:
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;
并注意到了显着的性能优势。让早期不再涉及减少返回的线程有任何缺点吗?
答案 0 :(得分:1)
由于您已经使用原始代码执行了if
语句,因此我没有看到任何缺陷。
如果if
语句的结果没有空间局部性(通常在整个块中的结果相同),您可能看不到任何加速。此外,加速可能取决于您的设备的功能:早期的CUDA设备可能无法提供性能提升。
答案 1 :(得分:1)
第二个代码段提供了更好的性能,因为未使用的warp不需要返回并执行分支检查。
理想情况下,在第二种情况下,您将每次迭代退出一次warp,从而减少GPU上的负载。