带 CUDA 内联汇编的 LLVM
LLVM with CUDA inline assembly
我正在尝试使用以下内联汇编编译 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
.
我想我应该 link 合适的图书馆,但我也有这个:L/cuda/install/lib
.
另一种可能是 NVPTX asm 不兼容。在这个 page 上,解释了 LLVM 对所有 PTX 变量都有不同的定义(对于 smid 和 warpid 也有一些定义)。现在如果提到的代码必须单独(而不是内联)编写和编译,我会迷路。
有没有人处理过类似的问题?欢迎提出建议。
您需要用双百分号引用特殊寄存器:%%smid
.
%%
转义序列在编译期间被转换为单个百分号,以便 ptxas 看到正确的特殊寄存器名称。双百分号版本在 nvcc 下也有效。
nvcc
似乎比 clang++
对内联汇编程序中的转义序列更宽容,并且不触及未知的转义序列,而不是像 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
.
我想我应该 link 合适的图书馆,但我也有这个:L/cuda/install/lib
.
另一种可能是 NVPTX asm 不兼容。在这个 page 上,解释了 LLVM 对所有 PTX 变量都有不同的定义(对于 smid 和 warpid 也有一些定义)。现在如果提到的代码必须单独(而不是内联)编写和编译,我会迷路。
有没有人处理过类似的问题?欢迎提出建议。
您需要用双百分号引用特殊寄存器:%%smid
.
%%
转义序列在编译期间被转换为单个百分号,以便 ptxas 看到正确的特殊寄存器名称。双百分号版本在 nvcc 下也有效。
nvcc
似乎比 clang++
对内联汇编程序中的转义序列更宽容,并且不触及未知的转义序列,而不是像 clang 在这种情况下那样发出错误。