CUDA&x27;双精度数据的s扭曲混洗
CUDA程序应该对双精度数据进行缩减,我使用朱利安·德茅斯的幻灯片“Shuffle:技巧和技巧” 洗牌功能如下:CUDA&x27;双精度数据的s扭曲混洗,cuda,shuffle,double-precision,Cuda,Shuffle,Double Precision,CUDA程序应该对双精度数据进行缩减,我使用朱利安·德茅斯的幻灯片“Shuffle:技巧和技巧” 洗牌功能如下: /*for shuffle of double-precision point */ __device__ __inline__ double shfl(double x, int lane) { int warpSize = 32; // Split the double number into 2 32b registers. int lo, hi;
/*for shuffle of double-precision point */
__device__ __inline__ double shfl(double x, int lane)
{
int warpSize = 32;
// Split the double number into 2 32b registers.
int lo, hi;
asm volatile("mov.b32 {%0,%1}, %2;":"=r"(lo),"=r"(hi):"d"(x));
// Shuffle the two 32b registers.
lo = __shfl_xor(lo,lane,warpSize);
hi = __shfl_xor(hi,lane,warpSize);
// Recreate the 64b number.
asm volatile("mov.b64 %0,{%1,%2};":"=d"(x):"r"(lo),"r"(hi));
return x;
}
目前,我在编译程序时遇到了以下错误
ptxas /tmp/tmpxft_00002cfb_00000000-5_csr_double.ptx, line 71; error : Arguments mismatch for instruction 'mov'
ptxas /tmp/tmpxft_00002cfb_00000000-5_csr_double.ptx, line 271; error : Arguments mismatch for instruction 'mov'
ptxas /tmp/tmpxft_00002cfb_00000000-5_csr_double.ptx, line 287; error : Arguments mismatch for instruction 'mov'
ptxas /tmp/tmpxft_00002cfb_00000000-5_csr_double.ptx, line 302; error : Arguments mismatch for instruction 'mov'
ptxas /tmp/tmpxft_00002cfb_00000000-5_csr_double.ptx, line 317; error : Arguments mismatch for instruction 'mov'
ptxas /tmp/tmpxft_00002cfb_00000000-5_csr_double.ptx, line 332; error : Arguments mismatch for instruction 'mov'
ptxas fatal : Ptx assembly aborted due to errors
make: *** [csr_double] error 255
有人能给点建议吗?将双参数加载到32位寄存器的内联汇编指令中存在语法错误。这:
asm volatile("mov.b32 {%0,%1}, %2;":"=r"(lo),"=r"(hi):"d"(x));
应该是:
asm volatile("mov.b64 {%0,%1}, %2;":"=r"(lo),"=r"(hi):"d"(x));
在32位加载中使用“d”(即64位浮点寄存器)作为源是非法的(mov.b32在这里没有意义,代码必须将64位加载到两个32位寄存器)。自CUDA 9.0起,
\uuuuushfl
,\uushfl up
,\ushfl down
和\uushfl xor>已被弃用
新推出的功能\uuuuushfl\u sync
、\uuushfl\u up\u sync
、\uuushfl\u down\u sync
和\uuushfl\u xor\u sync
具有以下原型:
T __shfl_sync(unsigned mask, T var, int srcLane, int width=warpSize);
T __shfl_up_sync(unsigned mask, T var, unsigned int delta, int width=warpSize);
T __shfl_down_sync(unsigned mask, T var, unsigned int delta, int
width=warpSize);
T __shfl_xor_sync(unsigned mask, T var, int laneMask, int width=warpSize);
其中T
可以是int
,无符号int
,长
,无符号长
,长
,无符号长
,浮点
或双精度
您不再需要为双精度算术创建自己的洗牌指令。我相信您的问题可能是大括号。我相信它们对gcc(至少在i386上)有特定的意义,并且在传递给汇编程序之前会被使用。看看-S输出是什么样子会很有趣。特别是内联asm的应用程序部分。@DavidWohlferd:大括号完全正确,编译代码的不是gcc,而是NVIDIA基于lvmm的GPU编译器。@talonmies更有意义。它看起来确实像gcc,但如果是的话,它就永远不会工作。@DavidWohlferd:CUDA内联asembler一开始是“非官方的”和“类似gcc的”,因为第一个支持来自于open64派生编译器NVIDIA最终使用的gcc 2.95前端所支持的残留高潮。随着时间的推移,它发展了很多,现在甚至支持用于寄存器作用域的嵌套大括号。PTX是一种SSA语言,因此要求与更传统的指令集稍有不同。@user3201449:还值得指出的是,该函数中的局部变量warpSize
将内置变量warpSize
化名。那条线应该去掉。今天它不会破坏任何东西,但有一天它可能会破坏,这取决于未来的体系结构是什么样子。@Tolonmes:我根据您的指示将其删除。无论如何,谢谢!