CUDA&x27;双精度数据的s扭曲混洗

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;

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;
    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:我根据您的指示将其删除。无论如何,谢谢!