我々は例えば、私たちの一般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()
ステートメントに副作用がないものとします。asm
が削除またはPTXの世代の中に移動されていないことを確認するために、あなたはvolatileキーワード
私はそれが何を意味するのか理解していないを使用する必要があります。したがって、
asm()
はなぜ削除されるのですか?コンパイラがそれに気付かない場合、なぜそれが削除されているのでしょうか?- PTXの生成中に
asm()
が移動した場合、なぜ問題になるのですか?それは最適化プロセスの一部ですね。 - 不揮発性で揮発性の命令にそれぞれ対応するとき、コンパイラの動作をより正確にどのように特徴付けていますか?