3

私のアプリケーションを実行すると、GPU の初期化が原因で、最初の cuda_malloc に 40 秒かかります。デバッグ モードでビルドすると、これは 5 秒に短縮され、Fermi デバイスで同じコードを実行すると、1 秒もかかりません (私の場合は測定する価値さえありません)。

おもしろいことに、sm20 の代わりにフラグ sm35 を使用して、この特定のアーキテクチャ用にコンパイルすると、再び高速になります。まだ新しい sm35 機能を使用するべきではないので、どうすれば sm20 用にコンパイルし、この大きな遅延を回避できますか? また、この遅延の原因は何ですか? マシンコードはオンザフライで sm35 コードに再コンパイルされますか?

Ps。私は Windows で実行していますが、同僚がおそらく Windows で同じ問題に遭遇しました。デバイスは Kepler、ドライバー バージョン 320 です。

4

1 に答える 1

4

はい、マシンコードはオンザフライで再コンパイルされます。これは JIT コンパイル ステップと呼ばれ、マシン コードが使用されているデバイスと一致しない場合に発生します (実行可能ファイルに有効な PTX コードが存在すると仮定します)。

JIT コンパイルの詳細については、こちらをご覧ください。最初の実行後に問題を軽減するキャッシュの説明に注意してください。

sm_20 と sm_35 の両方のコンパイルを指定すると、両方のタイプのデバイスですばやく実行されるバイナリ/実行可能ファイルをビルドできます。また、sm_20 でサポートされていない sm_35 機能を使用している場合 (コンパイル中に) も通知を受け取ります。処理する)。

于 2013-10-18T15:34:31.833 に答える