2011-07-13 2 views
3

私は効率的で時間がかかるので、この目的のためにカフを使用するコードを作成していますが、並列で非常に大きなデータのfftを計算しようとすると、CPUのfftwより遅くなり、精度の高いタイミングコードを使用するコード行ごとに、cudamallocは約0.983秒、残りのコード行は約0.00xx秒です。cudamallocはcudamemcpyよりも遅いですか?

私はいくつかの記事に関連するが、それら

に従ってGPUを有する主遅延は、メモリ転送しないメモリの割り当てに起因する

そしてまた、それが書かれた柱の一つが

CUDAライブラリ関数のいずれかに非常に最初の呼び出しは、この遅延の実際の理由が何であるかを初期化サブルーチン

に起動することで...またはコードの実行でそのような遅延を持つことは正常ではありませんか?

ありがとうございました

答えて

4

あなたが見ている大きな遅延(ほぼ1秒)はドライバの初期化に起因する可能性はありますか? cudaMallocではかなり長いようです。また、ドライバが最新であることを確認してください。

最初のカーネルの起動のための遅延は多数の要因によることができます。

  1. ドライバ初期化
  2. PTXコンパイル
  3. コンテキストの作成

これらの最初だけですXを使わないLinuxシステムで実行している場合に適用されます。この場合、ドライバは必要に応じてロードされ、その後にアンロードされます。このような遅延を避けるために、nvidia-smi -pm 1をrootとして実行すると、このような遅延を避けるためにドライバが永続モードで実行されます。詳細についてはman nvidia-smiをチェックし、再起動後も持続しないのでinitスクリプトに追加してください。

システムで特定のデバイスアーキテクチャ用のPTXをコンパイルするのに2番目の遅延があります。これは、デバイスアーキテクチャ(またはPTXをコンパイルせずに複数のアーチをサポートしたい場合はアーキテクチャ)のバイナリを実行可能ファイルに埋め込むことで簡単に回避できます。詳細は、「3.1.1.2 JITコンパイルに関する話題」のCUDA Cプログラミングガイド(NVIDIA websiteで利用可能)を参照してください。

コンテキストの作成という3つ目のポイントは避けられませんが、NVIDIAはコスト削減のために大きな努力を払っています。コンテクストの作成には、実行可能コードをデバイスにコピーすること、任意のデータオブジェクトをコピーすること、メモリシステムをセットアップすることなどが含まれる。

+1

あなたはそれ以上の調査をしていますが、その遅延は最初のcuda関数の呼び出し中であることがわかります...そして、私はVS 2008で作業しているので、おそらくPTXコンパイルによるものです詳細...返信ありがとうございました.. – snabbasi

+0

+1私のLinuxマシン(Xを実行していない)で 'nvidia-smi -pm 1 'を実行すると、CUDAプログラムを実行しているときの起動遅延がなくなりました。ありがとう! –

2

わかりました。 nvccは、アプリケーションバイナリにptxコードを埋め込みます。このバイナリは、JITコンパイラを使用してネイティブgpuバイナリにコンパイルする必要があります。これは起動遅延を説明します。 AFAIKのmallocはmemcpyよりも遅くはありません。

また、cudaRegisterFatBinaryとcudaRegisterFunctionは、カーネルとそのエントリポイントをランタイムに登録するために、nvccによってコードに挿入されることもあります。私はこれがあなたが話している初期化だと思います。

関連する問題