そのため、CUDA ストリーム機能と組み合わせて cuFFT を使用しています。私が抱えている問題は、cuFFT カーネルを完全な同時実行で実行できないように見えることです。以下は、nvvp から得た結果です。各ストリームは、サイズ 128x128 の 128 個の画像に対して 2D バッチ FFT のカーネルを実行しています。3 つのストリームをセットアップして、3 つの独立した FFT バッチ プランを実行します。
図からわかるように、一部のメモリ コピー (黄色のバー) が一部のカーネル計算 (紫、茶色、ピンクのバー) と並行していました。しかし、カーネルの実行はまったく並行していませんでした。お気づきのように、各カーネルは厳密に相互に追従していました。以下は、デバイスへのメモリ コピーとカーネルの起動に使用したコードです。
for (unsigned int j = 0; j < NUM_IMAGES; j++ ) {
gpuErrchk( cudaMemcpyAsync( dev_pointers_in[j],
image_vector[j],
NX*NY*NZ*sizeof(SimPixelType),
cudaMemcpyHostToDevice,
streams_fft[j]) );
gpuErrchk( cudaMemcpyAsync( dev_pointers_out[j],
out,
NX*NY*NZ*sizeof(cufftDoubleComplex),
cudaMemcpyHostToDevice,
streams_fft[j] ) );
cufftExecD2Z( planr2c[j],
(SimPixelType*)dev_pointers_in[j],
(cufftDoubleComplex*)dev_pointers_out[j]);
}
次に、すべてのメモリ コピー (同期) を完了し、すべてのカーネルを一度にストリームに送信するようにコードを変更したところ、次のプロファイリング結果が得られました。
その後、カーネルが同時に実行されていないことが確認されました。
「–default-stream per-thread」コマンドライン引数を渡すか、#include またはコードに #define CUDA_API_PER_THREAD_DEFAULT_STREAM を渡すことにより、完全な同時実行性を利用するようにセットアップする方法を詳細に説明する1 つのリンクを見ました。これは CUDA 7 で導入された機能です。GeForce GT750M を搭載した MacBook Pro Retina 15' (上記のリンクと同じマシン) で上記のリンクのサンプル コードを実行したところ、カーネルを同時に実行できました。しかし、cuFFT カーネルを並行して実行することはできませんでした。
次に、cuFFTカーネルがGPU全体を占有するため、2つのcuFFTカーネルが並行して実行されることはないと誰かが言っているこのリンクを見つけました。それから私は立ち往生しました。CUFFT が並行カーネルを有効にするかどうかを説明する正式なドキュメントが見つからなかったためです。これは本当ですか?これを回避する方法はありますか?