したがって、私はcuFFTとCUDAストリーム機能を組み合わせて使用しています。私が持っている問題は、cuFFTカーネルを完全な並行性で走らせることができないということです。以下は、nvvpの結果です。各ストリームは、サイズ128x128の128個の画像に対して2DバッチFFTのカーネルを実行しています。 3つの独立したFFTバッチプランを実行するために3つのストリームをセットアップしました。図から分かるようcuFFTストリームの同時実行
、いくつかのメモリ・コピー(黄色のバー)は、いくつかのカーネル演算(、紫褐色、ピンクバー)と並行していました。しかし、カーネル実行はまったく同時ではありませんでした。あなたが気づくごとに、各カーネルは互いに厳密に従っていました。以下は、デバイスへのメモリコピーとカーネルの起動に使用したコードです。そして、私がいた
:私は(同期)すべてのメモリコピーを終えて、一度にストリームにすべてのカーネルを送信し、私は、次のプロファイリング結果を得たように
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]);
}
は、その後、私は私のコードを変更しましたカーネルが並行して実行されていないことを確認しました。
私はあなたが#includeしたり、あなたのコード内で前に設定するか渡す「-default-ストリームスレッドごとの」コマンドライン引数またはの#define CUDA_API_PER_THREAD_DEFAULT_STREAMでフル並行性を活用する方法を詳細に説明している1 linkを見ました。これはCUDA 7で導入された機能です。上記のリンクにあるMacBook Pro Retina 15 'のサンプルコードをGeForce GT750M(上記のリンクと同じマシン)で実行し、同時にカーネルを実行することができました。しかし、私はcuFFTカーネルを並行して走らせることができませんでした。
私はこれを見つけました。誰かがcuFFTカーネルがGPU全体を占有していると言って、2つのcuFFTカーネルは並行して走っていません。それから私は立ち往生した。私は、CUFFTが並行カーネルを有効にするかどうかを扱う正式な文書は見つけていないので、これは本当ですか?これを回避する方法はありますか?