【发布时间】:2022-01-02 19:45:59
【问题描述】:
在 Nvidia 的并行缩减教程here 中,我在理解“最后一个扭曲循环展开”技术背后的逻辑时遇到了问题。
如果是thread31(tid=31),在展开循环之前:
这个线程只执行这些操作:
sdata[31] += sdata[31+64]
sdata[31] += sdata[31+32]
但循环展开后(如下图):
thread31 的条件if(tid < 32) 为真,并且将为其执行warpReduce 函数,因此所有这些在展开循环版本中不会执行的操作现在都将执行:
sdata[31] += sdata[31+32] //for second time
sdata[31] += sdata[31+16]
...
sdata[31] += sdata[31+1]
这背后的逻辑是什么?
【问题讨论】:
标签: parallel-processing cuda nvidia reduction loop-unrolling