1

cuFFT ライブラリを使用しています。NVIDIA Visual Profiler NVVP でこのライブラリ (またはその他の CUDA ライブラリ) からの関数呼び出しを確認するには、コードを変更するにはどうすればよいですか? Windows と Visual Studio 2013 を使用しています。

以下は私のコードです。画像とフィルターをフーリエ ドメインに変換し、作成したカスタム CUDA カーネルで点単位の複素行列乗算を実行し、フィルター処理された画像スペクトルに対して単純に逆 DFT を実行します。結果は正確ですが、プロファイラーで cuFFT 関数を表示する方法がわかりません。

// Execute FFT Plans
cufftExecR2C(fftPlanFwd, (cufftReal *)d_in, (cufftComplex *)d_img_Spectrum);
cufftExecR2C(fftPlanFwd, (cufftReal *)d_filter, (cufftComplex *)d_filter_Spectrum);

// Perform complex pointwise muliplication on filter spectrum and image spectrum
pointWise_complex_matrix_mult_kernel << <grid, block >> >(d_img_Spectrum, d_filter_Spectrum, d_filtered_Spectrum, ROWS, COLS);

// Execute FFT^-1 Plan                  
cufftExecC2R(fftPlanInv, (cufftComplex *)d_filtered_Spectrum, (cufftReal *)d_out);

ここに画像の説明を入力

4

1 に答える 1

3

ライブラリへのエントリ ポイントでのライブラリ呼び出しは、C または C++ ライブラリへの他の呼び出しと同様に、ホスト上で実行されます。そのライブラリ呼び出し内で、CUFFT などの CUDA GPU 対応ライブラリの CUDA カーネルまたはその他の CUDA API 関数への呼び出しがある場合があります。

プロファイラー (少なくとも CUDA 7.0 まで - 以下の CUDA 7.5 nvprof に関するメモを参照) は、ホスト コードのプロファイリングをネイティブにサポートしていません。主にカーネル呼び出しとCUDA API呼び出しに焦点を当てています。CUFFT のようなライブラリへの呼び出し自体は、CUDA API 呼び出しとは見なされません。

プロファイラーの完全な出力は示されていませんが、CUFFT ライブラリーが CUDA カーネル呼び出しを行っていることがわかるはずです。これらはプロファイラーの出力に表示されます。前の最初の 2 つの CUFFT 呼び出しにpointWise_complex_matrix_mult_kernelは、それぞれそのカーネルの左側に表示される 1 つ以上のカーネル呼び出しが必要であり、最後の CUFFT 呼び出しには、そのカーネルの右側に表示される 1 つ以上のカーネル呼び出しが必要です。

ホスト コードの特定のセクションをプロファイラーに表示する方法の 1 つは、NVTX (NVIDIA Tools Extension) ライブラリを使用してソース コードに注釈を付けることです。これにより、これらの注釈がプロファイラーの出力に表示されます。プロファイラー出力で識別したいライブラリ呼び出しの周りにNVTX 範囲イベントを配置することができます。

nvprof別のアプローチは、CUDA 7.5の新しい CPU プロファイリング機能を試すことです。CUDA 7.5RC に同梱されているプロファイラー ガイドのセクション 3.4 を参照できます。

最後に、通常のホスト プロファイラーは、CUFFT ライブラリ呼び出しを含む CUDA アプリケーションをプロファイリングできるはずですが、GPU で何が起こっているかを可視化することはできません。

編集:以下のコメントの議論に基づいて、あなたのコードはsimpleCUFFT サンプル コードに似ているようです。Win7 x64、VS 2013 Community、および CUDA 7 でそのコードをコンパイルしてプロファイリングすると、次の出力が得られます (タイムラインの興味深い部分を示すために拡大しています)。

simpleCUFFT サンプル コードの nvvp プロファイラー タイムライン

そのコードに現れる複雑な点ごとの乗算およびスケーリング カーネルの前後に、CUFFT カーネルが呼び出されていることがわかります。私の提案は、独自のコードではなく、simpleCUFFT サンプル コードで同様のことを行うことから始めて、上記の出力を複製できるかどうかを確認することです。その場合、問題はコードにあります (CUFFT 呼び出しが失敗している可能性があります。適切なエラー チェックを追加する必要があるなど)。

于 2015-07-13T17:10:54.817 に答える