关于内联PTX的CUDA文档,第1.2.3 Incorrect optimization部分说:
除了更改输出操作数之外,编译器假定
asm()
语句没有副作用。为确保在生成PTX期间不会删除或移动asm
,您应使用volatile
关键字,例如:asm volatile ("mov.u32 %0, %%clock;" : "=r"(x));
如果我的内联PTX在寄存器之外确实没有副作用,我应该从不使用volatile,还是在某些情况下我可能仍然想要它?
答案 0 :(得分:2)
假设规则与使用相同约束语法的“常规”(非CUDA)GNU C内联汇编相同:
如果您希望每次源执行语句时重新运行指令,请使用volatile
。 (这可能是您每次都要重新阅读%clock
)。
如果你想让编译器将它从一个循环中提升出来,或者只是在一个块之前和之后该语句的两个结果之间进行CSE,那么就不要使用volatile
。
GNU C 非volatile
扩展 - asm
语句被视为其输入的纯函数。 (没有输出隐式地生成一个语句volatile
。)这包括没有输入的纯函数的情况:通过省略volatile
,你告诉编译器它每次都产生相同的输出。
这可能适合于读取您不打算修改的CPU控制寄存器,或者从您没有告诉编译器的内存位置加载值。这绝对不是你想读的时钟。
即。 每次读取不一样的东西都算作副作用。