漏斗转移 - 它是什么?

16
阅读CUDA 5.0编程指南时,我发现有一项名为“漏斗移位(Funnel shift)”的功能,它存在于3.5计算能力的设备中,但不存在于3.0中。指南中有一个注释“请参考参考手册”,但当我在手册中搜索“funnel shift”时,没有找到任何相关内容。我尝试通过谷歌搜索,只在第8章的http://www.cudahandbook.com上找到了这方面的提及:
8.2.3 漏斗移位(SM 3.5)
GK110添加了一种64位的“漏斗移位”指令,可以通过以下内置函数访问:
__funnelshift_lc():返回左侧漏斗移位的最高32位。
__funnelshift_rc():返回右侧漏斗移位的最低32位。
这些内置函数是在sm_35_intrinsics.h中实现的内嵌设备函数(使用内嵌PTX汇编)。但这仍然没有解释“左侧漏斗移位”或“右侧漏斗移位”是什么。
那么,什么是漏斗移位,人们在哪些情况下需要它?

1
漏斗移位是指将两个输入单词连接起来,然后进行移位操作,并从连接/移位结果中提取一个指定大小的输出单词。 - talonmies
这与__shfl_up(value, index)不同吗? - lashgar
1
正如talonmies所说,漏斗移位器从两个n位字的串联中提取任何连续的n位比特组。请注意,漏斗移位器通过使两个输入成为相同的n位字,提供了有效实现旋转的方法。使用术语“漏斗”暗示了输入比输出宽。 - njuffa
talonmies,njuffa,Archaea,想写一个答案吗? - harrism
谢谢您的评论。我认为我理解它的作用,但如果能有一个好的答案(也许附带一个清晰的好例子),那就太棒了!对于我和可能会遇到这个问题的其他人来说都是如此。同时,在这里见到手册的作者真是太好了。没想到会在这里遇到 :) - CygnusX1
显示剩余2条评论
1个回答

9

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

sm_35_intrinsics.h中的内置函数如下:

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在上面的评论中提到的那样,如果两个输入字相同,则可以使用它来实现旋转。

2
听起来简单来说,这是一个带有32位操作数和结果的64位移位操作?可能是因为所有寄存器都是32位。 - CrazyCasta
是的,实际上在拥有64位寄存器的计算机上,漏斗移位将让您在寄存器对上执行128位移位。 - ArchaeaSoftware
2
注意:链接似乎已经失效。 - BenC
@ArchaeaSoftware:链接已失效。 - einpoklum
我之前给Andy写过信,他说他会修复链接,但是没有这样的运气。我已经轻微地编辑了答案以删除链接。 - ArchaeaSoftware

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接