是否有理由对PTX使用asm volatile而没有副作用?

时间:2017-12-08 14:14:23

标签: cuda inline-assembly volatile ptx

关于内联PTX的CUDA文档,第1.2.3 Incorrect optimization部分说:

  

除了更改输出操作数之外,编译器假定asm()语句没有副作用。为确保在生成PTX期间不会删除或移动asm,您应使用volatile关键字,例如:

asm volatile ("mov.u32 %0, %%clock;" : "=r"(x));

如果我的内联PTX在寄存器之外确实没有副作用,我应该从不使用volatile,还是在某些情况下我可能仍然想要它?

1 个答案:

答案 0 :(得分:2)

假设规则与使用相同约束语法的“常规”(非CUDA)GNU C内联汇编相同:

如果您希望每次源执行语句时重新运行指令,请使用volatile。 (这可能是您每次都要重新阅读%clock)。

如果你想让编译器将它从一个循环中提升出来,或者只是在一个块之前和之后该语句的两个结果之间进行CSE,那么就不要使用volatile

GNU C volatile扩展 - asm语句被视为其输入的纯函数。 (没有输出隐式地生成一个语句volatile。)这包括没有输入的纯函数的情况:通过省略volatile,你告诉编译器它每次都产生相同的输出。

这可能适合于读取您不打算修改的CPU控制寄存器,或者从您没有告诉编译器的内存位置加载值。这绝对不是你想读的时钟。

即。 每次读取不一样的东西都算作副作用