具有CUDA内联汇编的LLVM

时间:2016-10-16 19:01:44

标签: c++ cuda llvm-clang

我正在尝试使用以下内联汇编编译CUDA代码:

static __device__ uint get_smid(void) {
    uint ret;
    asm("mov.u32 %0, %smid;" : "=r"(ret) );
    return ret;
}

代码使用nvcc标记-Xptxas -v进行编译。

当我尝试使用clang++(版本4.0)编译它时,使用相应的标记-Xcuda-ptxas -v(我认为这是对的,但我可能会弄错),我得到以下错误:

  

../../include/cutil_subset.h:23:25: error: invalid % escape in inline assembly string asm("mov.u32 %0, %smid;" : "=r"(ret) );

它指向%smid

我想我想连接正确的库但我也有这个:L/cuda/install/lib

另一种可能性是NVPTX asm不兼容。在这个page上,解释了LLVM对所有PTX变量有不同的定义(还有一些用于smid和warpid)。现在,如果提到的代码必须单独(不是内联)编写和编译,我就迷失了。

以前有人处理过类似的问题吗?欢迎提出建议。

1 个答案:

答案 0 :(得分:4)

您需要使用双百分号来引用特殊寄存器:%%smid

%%转义序列在编译期间转换为单位百分号,以便ptxas看到正确的特殊寄存器名称。双百分号版本也适用于nvcc。

nvcc似乎对内联汇编程序中的转义序列比clang++更宽容,并且保留未知的转义序列而不是发出错误,因为在这种情况下是clang。