0

使用 CUDA 的 shfl.idx 指令,我们执行本质上是一个经线内聚集:每个通道提供一个基准和一个原点通道,并获取原点通道的基准。

逆运算,scatter呢?我的意思是,不是分散到记忆中,而是分散到车道上。也就是说,每条车道都提供了一个基准和一个目的地车道,并且对于恰好有另一条车道瞄准它们的车道 - 它们最终具有目标车道的值;其他通道以未定义/任意值结束。

我很确定 PTX 没有这样的东西。它可能以某种方式存在于SASS中吗?如果没有,是否有比通过通道索引分散到共享内存和从共享内存加载更好的方法来实现这一点?

4

1 回答 1

1

洗牌操作都是根据要读取的通道定义的。CUDA 函数几乎直接映射到 ptx 指令,而这些指令本身几乎直接映射到 SASS。它们都是“使该值可供他人读取,并从给定的目标车道读取值”操作的变体,具有多种方便的方式来指定目标车道。

一般来说,您应该尝试重新调整您的功能,这样您就不需要“分散”操作。没有指令可以满足您的要求。

使用现有的 warp 内在函数来实现这一点可能是可能的,但并不明显。您可以使用一系列 shuffle 类似于您用于减少 warp 的方法来传输源通道 ID,然后进行最终的 shuffle 以将有效负载提取到所需的通道中。

于 2018-02-08T03:35:37.340 回答