【发布时间】:2016-01-03 03:11:32
【问题描述】:
根据CUDA documentation,__shfl() 内在函数允许在线程之间交换变量。更具体地说,__shfl_up() 和__shfl_down()(也称为__shfl_xor())允许交换不同通道的变量。 unsigned int delta 是这些的第二个参数,并指定(正或负)要交换变量的通道的 offset 通道 ID。我一直认为delta 对于经线中的所有车道必须保持不变。因此,例如,必须像这样调用
val += __shfl_down(val, 3);
或
for (i = 1; i < warpSize / 2; i ++)
val += __shfl_down(val, i);
但是,我刚刚意识到没有明确说明 delta 对于所有车道必须相同(只要所有车道都参与)。所以,是下面undefined还是罚款
val += __shfl_down(val, threadIdx.x % warpSize);
这只是一个例子,许多通道不会添加任何内容,因为 delta "will not wrap around ... so effectively the upper delta lanes will remain unchanged.". 也没有指定 delta 必须是 >0,0 必须只返回与 out 相同的值-of-range delta?
除此之外,这里的文档是不是自相矛盾?
线程只能从另一个积极参与
__shfl()命令的线程读取数据。如果目标线程处于非活动状态,则检索到的值未定义。
所以它对于非活动线程是未定义的,但是...
所有
__shfl()内部函数都将源通道 ID 中 var 引用的 4 字节字作为无符号整数返回。如果源通道 ID 超出范围或源线程已退出,则返回调用线程自己的 var。
... 这意味着对于非活动线程,它返回调用线程自己的 var。这进一步意味着,在我上面的示例中,如果delta 越界,它会自行添加,而不是什么?
【问题讨论】: