cuda4.2 循环移位指令、cuda5.0 循环移位指令分别是什么?
如何用汇编ptx该如何写呢???
楼主您好。循环移位可以在CUDA C里使用如下语句实现:
例如:
unsigned int a = …;
unsigned int b = (a << 3) | (a >> 29);
来实现:b = a循环左移3位
此代码将在:
1.x上: 变成1条左移,1条右移,1条or(或者加法). 共3条指令
2.x/3.0上: 变成1条右移,1条左移并相加指令。共2条指令
3.x:变成一条funnel shift指令。
因为您可以直接在CUDA C里实现循环移位,所以将不为您提供ptx版本的实现。
我明白前两条的意思,现在我想以一条指令来做循环移位,像汇编语言一样一步到位,因为我的算法程序中有很多循环移位,这样可以极大地提高程序的执行效率,第三条那个funnel shfit指令是不是cuda中的循环移位指令, 是cuda4.0中的指令还是cuda5.0中的指令,请大概介绍下这个指令的用法,谢谢了!
这个指令在sm_35_intrinsics.h定义
注意只有sm_35支持此项功能,速度较快。funnel shift的两个参数相同时,可以用来执行循环位移操作。
楼主您好,您无需知道3.5中具体指令该怎么写,也无需使用intrinsic函数。
您只需要使用按照C的语法写:(a<<x)|(a>>y), 当x + y = 32的时候,编译器将自动生成funnel shift指令。
感谢周末来访。
我已经在2#给你演示用法了。你还想怎么用?
您只需要在1.x/2.x,3.0/3.5上分别使用(a << x) | (a >> y)即可。
编译器会自动负责映射为3条,2条,或者1条指令的。
话说您为何不直接这么写呢???为何不这样!!!!
你确定你看了我的2#了么!!
你对我起我周日顶着40度高温给你回帖么!
楼主自重。谢谢。
千军兄保重
王兄也保重!
版主,如果是sm3.0或者sm2.0的话,按你的意思是说编辑器最多优化成2条指令,只有sm3.5才能优化成1条指令,若我想以一条指令来做的话在sm3.0或者sm2.0该如何做呢?
LZ您好:
1:您的意图如果需要单条指令完成,那么只能用funnel shift指令。
2:funnel shift目前只在SM3.5的GPU上提供,这是SM3.5的GPU的新的硬件特性,之前SM版本的GPU不具备此能力。
3:所以,您无法在SM3.0,SM2.X,SM1.X的硬件上使用单条指令来完成此项工作。不过他们结果是等效的,只是快慢不同。话说越新的硬件越快,这还是符合一般规律的。
大致如此,祝您编码顺利~