Cuda 漏斗移位-是什么?

Cuda 漏斗移位-是什么?,cuda,intrinsics,ptx,Cuda,Intrinsics,Ptx,在阅读CUDA 5.0编程指南时,我偶然发现了一个称为“漏斗移位”的功能,它出现在3.5可计算设备中,但不是3.0。它包含一个注释“参见参考手册”,但当我在手册中搜索“漏斗移动”术语时,我没有找到任何内容 我试着在谷歌上搜索它,但只在第8章中找到了一个提及: 8.2.3漏斗位移(SM 3.5) GK110添加了64位“漏斗移位”指令,可通过以下内部函数访问该指令: __漏斗移位_lc():返回左漏斗移位的最高有效32位 __漏斗移位_rc():返回右漏斗移位的最低有效32位 这些内部函数作为内联

在阅读CUDA 5.0编程指南时,我偶然发现了一个称为“漏斗移位”的功能,它出现在3.5可计算设备中,但不是3.0。它包含一个注释“参见参考手册”,但当我在手册中搜索“漏斗移动”术语时,我没有找到任何内容

我试着在谷歌上搜索它,但只在第8章中找到了一个提及:

8.2.3漏斗位移(SM 3.5)

GK110添加了64位“漏斗移位”指令,可通过以下内部函数访问该指令:

__漏斗移位_lc():返回左漏斗移位的最高有效32位

__漏斗移位_rc():返回右漏斗移位的最低有效32位

这些内部函数作为内联设备实现 sm_35_intrinsics.h中的函数(使用内联PTX汇编程序)

…但它仍然不能解释什么是“左漏斗移位”或“右漏斗移位”


那么,它是什么?在哪里需要它?

在CUDA的情况下,两个32位寄存器连接在一起,形成一个64位值;该值向左或向右移动;并且返回最高有效位(对于左移位)或最低有效位(对于右移位)32位

sm_35_intrinsics.h
中的intrinsics如下所示:

unsigned int __funnelshift_lc(unsigned int lo, unsigned int hi, unsigned int shift);
unsigned int __funnelshift_rc(unsigned int lo, unsigned int hi, unsigned int shift);

根据Andy Glew(已移除死链)的说法,漏斗移位的应用包括快速错位memcpy;正如njuffa在上面的评论中提到的,如果两个输入字相同,它可以用来实现旋转。

漏斗移位是指两个输入字连接在一起,然后移位,并从连接/移位的结果中提取字号输出。这与talonmies说的“值,索引”不同吗,漏斗移位器从两个n位字的串联中提取任何连续的n位组。请注意,漏斗移位器通过使两个输入具有相同的n位字,从而有效地实现旋转。“漏斗”一词的使用暗指输入比输出更广泛。啊,这是对CUDA手册的良好反馈。我需要在这里补充一点澄清的语言,似乎:-)@ahmad,是的,它不同于uu shfl\u up()。shuffle指令可以在一个warp中的线程之间进行数据交换。因此,简单来说,它听起来像是一个64位移位,带32位操作数和结果?大概是因为寄存器都是32位的。是的,事实上,在有64位寄存器的机器上,漏斗移位可以让您对寄存器对执行128位移位。注意:链接似乎已断开。@ArchaEastware:链接已断开。我不久前写信给Andy,他说他会修复链接,但没有这样的运气。我轻轻地编辑了答案,删除了链接。