我正在尝试使用以下内联汇编编译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)。现在,如果提到的代码必须单独(不是内联)编写和编译,我就迷失了。
以前有人处理过类似的问题吗?欢迎提出建议。
答案 0 :(得分:4)
您需要使用双百分号来引用特殊寄存器:%%smid
。
%%
转义序列在编译期间转换为单位百分号,以便ptxas看到正确的特殊寄存器名称。双百分号版本也适用于nvcc。
nvcc
似乎对内联汇编程序中的转义序列比clang++
更宽容,并且保留未知的转义序列而不是发出错误,因为在这种情况下是clang。