当我们在我们通常的 C/C++ CUDA 代码中编写内联 PTX 程序集时,例如:
__device__ __inline__ uint32_t bfind(uint32_t val)
{
uint32_t ret;
asm ("bfind.u32 %0, %1;" : "=r"(ret): "r"(val));
return ret;
}
我们可以在volatile
之后添加关键字asm
,例如:
__device__ __inline__ uint32_t bfind(uint32_t val)
{
uint32_t ret;
asm volatile ("bfind.u32 %0, %1;" : "=r"(ret): "r"(val));
return ret;
}
内联 PTX 程序集的 CUDA文档说:
编译器假定
asm()
语句除了更改输出操作数外没有副作用。为确保asm
在 PTX 生成过程中不被删除或移动,您应该使用 volatile 关键字
我不明白那是什么意思。所以,
- 为什么我的
asm()
会被删除?或者更确切地说,如果编译器注意到它没有效果,我为什么要介意它被删除? - 为什么
asm()
在 PTX 生成过程中移动 my 会出现问题?这是优化过程的一部分,不是吗? - 当分别面对非易失性和易失性
asm()
指令时,如何更准确地描述编译器的行为?