当我们在一般的C/C++ CUDA代码,例如编写内联PTX汇编:当使用内联PTX asm()指令时,'volatile'会做什么?
__device__ __inline__ uint32_t bfind(uint32_t val)
{
uint32_t ret;
asm ("bfind.u32 %0, %1;" : "=r"(ret): "r"(val));
return ret;
}
我们可以asm
后添加volatile
关键字,例如:
__device__ __inline__ uint32_t bfind(uint32_t val)
{
uint32_t ret;
asm volatile ("bfind.u32 %0, %1;" : "=r"(ret): "r"(val));
return ret;
}
的CUDA documentation on inline PTX assembly说:
编译器假定一个
asm()
语句没有副作用,除了改变输出操作数。为确保在生成PTX期间不删除或移动asm
,应使用volatile关键字
我不明白这意味着什么。所以,
- 为什么我的
asm()
被删除?或者说,如果编译器发现它没有效果,为什么我应该介意它被删除? - 为什么在PTX生成期间我的
asm()
被移动,这是一个问题?这是优化过程的一部分,不是吗? - 如何在分别面对非易失性和易失性指令时更准确地表征编译器的行为?