2016-04-08 34 views
2

.hと.cuで書かれたクラスがたくさんあるので、再配置可能なデバイスコード(-rdc = true)を試しました。それは約12秒かかる。次に、コードを結合しようとしましたが、ヘッダのみのクラスを使用して-rdc = trueを削除すると、わずか2秒しかかかりませんでした。-rdc = trueが指定されていると、cudaコードが非常に遅くなる理由

コードでは、sha1(ある文字列)0x40000回がwinrar暗号化で使用されます。

なぜですか?今は大丈夫ですが、プロジェクトが大きくなり、別々のコンパイルが便利になります。 -rdc = trueはパフォーマンスを低下させる可能性がありますか?

答えて

2

別の編集がこの減速を引き起こす可能性があります。。コンパイラは、特定の最適化を適用するのに十分な情報を持っていない可能性があります(すべてのリンク時間情報がありません)。どうやら、nvccはまだリンク段階でこれらの最適化を組み入れていません。

+4

コード自体に関する情報がないと仮定するのは難しいです。 CUDAコンパイラは、「プログラム全体」モードでコンパイルすると機能を積極的にインライン化します。これにより、多くの場合、追加の最適化(一般的な部分式削除、定数伝播、ロードスケジューリングの改善)が可能になります。 '-rdc = true 'を使用すると、CUDAツールチェーンに最適化リンカーがないため、コンパイル単位の境界を越えて関数をインライン化することはできません。別々にコンパイルされた関数への呼び出しは、ABI呼び出し規約のオーバーヘッドを引き起こし、インライン展開によって可能になる他の最適化は行われません。 – njuffa

2

fuctionのコードが、呼び出し元のエントリポイントのヘッダにない別の翻訳単位にある場合、インライン化は発生しません。この場合、関数呼び出しはより高価になります。コンパイル時にインライン化する機会があるように、インラインキーワードを使用してヘッダファイルに時間の重要な機能を配置することができます。

ローカルアドレス空間をパラメータに使用する場合(パラメータ受け渡しの場合はhttp://docs.nvidia.com/cuda/parallel-thread-execution/index.html#abstracting-abiを参照)、これはレジスタよりもはるかに高価です(http://docs.nvidia.com/cuda/parallel-thread-execution/index.html#operand-costs)。

リンクの問題を避けるために、クラス実装ファイルからインラインキーワードを含むヘッダーファイルにいくつかのメソッドを移動することが解決策になる場合があります。

関連する問題