Cuda 如何实现shfl.idx的相反操作(即扭曲散射而不是扭曲聚集)?

Cuda 如何实现shfl.idx的相反操作(即扭曲散射而不是扭曲聚集)?,cuda,shuffle,ptx,gpu-warp,Cuda,Shuffle,Ptx,Gpu Warp,使用CUDA的shfl.idx指令,我们执行本质上是内部扭曲聚集的操作:每个通道提供一个基准和一个原点通道,并获取原点通道的基准 那逆向操作呢,分散?我的意思是,不是分散到记忆中,而是分散到车道上。也就是说,每个车道提供一个基准和一个目的车道,对于正好有一个其他车道以它们为目标的车道,它们以目标车道的值结束;其他车道以未定义/任意值结束 我很确定PTX没有这样的东西。它是否以某种方式存在于SASS中?如果没有,有没有比分散到共享内存和从共享内存加载更好的实现方法,这两种方法都是通过通道索引实现的

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

那逆向操作呢,分散?我的意思是,不是分散到记忆中,而是分散到车道上。也就是说,每个车道提供一个基准和一个目的车道,对于正好有一个其他车道以它们为目标的车道,它们以目标车道的值结束;其他车道以未定义/任意值结束


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

洗牌操作都是根据要读取的通道定义的。CUDA功能几乎直接映射到ptx指令,而ptx指令本身几乎直接映射到SASS。它们都是操作“使此值可供其他人读取,并从给定目标车道读取值”的变体,使用各种方便的方法指定目标车道

通常,您应该尝试重新调整函数,这样就不需要“分散”操作。没有一条指令能满足你的要求


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

您还没有详细说明具体的方法。。。关于使用多重洗牌-即使我们可以限制它们的原木数量(扭曲大小),这也会非常昂贵,但事实似乎并非如此。此外,分散操作肯定会出现在各种工作负载中,并且不太“可重新调整”;因此,例如Intel的AVX512似乎提供了某种分散性。您在问题中概述的共享内存方法可能是最快的。因此,期望有人提供一个更扭曲的方法,只使用洗牌操作似乎是愚蠢的。我有理由相信,没有你所设想的那种本土分散。若你们想在未来的NVIDIA GPU中看到一个新特性,你们可以通过bug reporting portal请求它,只需在描述中用RFE关键字标记你们的bug。在大多数方面,我认为这个答案是正确的。