2017-12-08 22 views
0

CUDAドキュメンテーション、セクション1.2.3 Incorrect optimizationは、こう述べています。副作用のないPTXにasm volatileを使用する理由はありますか?インラインPTXの

コンパイラはasm()文は出力オペランドを変更する以外は副作用がないことを前提としています。 asmはPTXの生成時に削除または移動されていないことを確認するために、あなたはvolatileキーワード、例えば使用する必要があります。私のインラインPTXが実際にレジスタの外に何の副作用を持っていないない場合

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

を、私がすべき揮発性を使用することは決してありませんか、それとも私はまだそれを持っていたいかもしれない場合がありますか?ルールを仮定

答えて

2

は同じ制約構文を使用して「通常の」(非CUDA)GNU Cインラインアセンブリと同じです:


あなたはそれを再実行命令(複数可)したい場合ソースがステートメントを実行するたびに、volatileを使用します。 (これはおそらく毎回%clockを再読み込みしたいものです)。

コンパイラにブロックの前後にこのステートメントの2つの結果の間にループを持たせたい場合は、volatileを使用しないでください。

GNU C volatile extended-asmステートメントは入力の純粋な機能として扱われます。 (出力がない場合、暗黙的に文volatileが作成されます)。入力がない純粋な関数の場合も含まれます:volatileを省略すると、毎回同じ出力が生成されます。

これは、変更を予定していないCPUコントロールレジスタを読み取る場合や、コンパイラに通知していないメモリ位置から値をロードする場合に適しています。それは間違いなくあなたが時計を読むために欲しいものではありません。

I.e. 毎回同じものでないものを読み取ると、副作用としてカウントされます

関連する問題