【发布时间】:2017-04-23 10:23:38
【问题描述】:
当我们在我们通常的 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;
}
我们可以在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()语句除了更改输出操作数外没有副作用。为确保asm在PTX生成过程中不被删除或移动,您应该使用volatile关键字
我不明白那是什么意思。所以,
- 为什么我的
asm()会被删除?或者更确切地说,如果编译器注意到它没有效果,我为什么要介意它被删除? - 如果我的
asm()在生成 PTX 期间被移动,为什么会出现问题?这是优化过程的一部分,不是吗? - 当分别面对非易失性和易失性
asm()指令时,如何更准确地描述编译器的行为?
【问题讨论】:
标签: cuda volatile inline-assembly ptx