GPUでピーク単精度フロップを測定しようとしています。そのため、レジスタで連続したMAD命令を実行するようにPTXファイルを変更しています。残念ながら、データのロード/ストアを実行しないため、コンパイラは実際には何の役にも立たないため、すべてのコードを削除しています。コンパイラがコードに触れないようにコードに追加するコンパイラフラグまたはプラグマはありますか?
ありがとう。
GPUでピーク単精度フロップを測定しようとしています。そのため、レジスタで連続したMAD命令を実行するようにPTXファイルを変更しています。残念ながら、データのロード/ストアを実行しないため、コンパイラは実際には何の役にも立たないため、すべてのコードを削除しています。コンパイラがコードに触れないようにコードに追加するコンパイラフラグまたはプラグマはありますか?
ありがとう。
nvcc で最適化を完全に無効にするには、次を使用できます。
nvcc -O0 -Xopencc -O0 -Xptxas -O0 // sm_1x targets using Open64 frontend
nvcc -O0 -Xcicc -O0 -Xptxas -O0 // sm_2x and sm_3x targets using NVVM frontend
結果のコードは非常に遅くなる可能性があることに注意してください。-O0 フラグはホスト コンパイラに渡され、ホスト コードの最適化を無効にします。-Xopencc -O0 および -Xcicc -O0 フラグは、コンパイラのフロントエンド (PTX を生成する部分) を制御し、そこでの最適化をオフにします。-Xptxas -O0 フラグは、コンパイラ バックエンド (PTX をマシン コードに変換する部分) を制御し、その部分の最適化をオフにします。-Xopencc、-Xcicc、および -Xptxas フラグはコンポーネント レベルのフラグであり、nvcc マニュアルに記載されていない限り、サポートされていないと見なされるべきであることに注意してください。
コンパイラでそのような最適化をオフにする方法はないと思います。これを回避するには、コードを追加して値を保存し、そのコードを常に false である条件ステートメントでラップします。コンパイラが常に false であると判断できない条件を作成するには、少なくとも 1 つの変数 (定数だけでなく) を使用します。
(私はまだ CUDA 4.0 を使用しています。新しいバージョンでは変更されている可能性があります)
(ptx を cubin に変換するツール) の最適化を無効にするptxas
には、オプションを渡す必要があります--opt-level 0
(デフォルトは です--opt-level 3
)。このオプションを通過させたい場合nvcc
は、接頭辞を付ける必要があります--ptxas-options
。
ただし、これptxas
は多くの有用な最適化を行うことに注意してください。これを無効にすると、まったく正しくない場合でも、コードのレンダリングがさらに遅くなる可能性があります。たとえば、レジスタの割り当てを行い、どこが共有メモリでどこがグローバル メモリかを予測しようとします。
私の知る限り、そのためのコンパイラ フラグやプラグマはありません。しかし、より多くの計算を行い、保存する量を減らすことができます