私は最近CUDAを学び始めました、そして私は理解できない非常に奇妙な行動に出くわしました。
私のコードは基本的に、単純なatomicAddカーネルの平均実行時間を計算します。これを実現するために、カーネルをループで呼び出して、より良い平均を取得します。実行時間の見積もりにこれを含めたいので、デバイスのメモリ割り当てとコピーをループに含めます。問題は、ループを通過する実行回数が多すぎると、プログラムがランタイムAPIエラー30で失敗することがよくあることです。
メモリアクセスに問題があるのではないかと思ったので、プログラムでmemcheckを実行しても無駄になりました。明らかにメモリエラーはありません。また、カーネルを数回実行するだけであれば問題はありません。これは、カーネルが正確に問題ではないことを示しているようにも見えます。問題が発生するのは、頻繁に連続して呼び出す場合のみです。
私のコードのスケルトンは次のとおりです。
for(int i = 0; i < runs; i++)
{
//////////////////////////////////
// Copy memory from Host to Device
//////////////////////////////////
cutilSafeCallNoSync( cudaMemcpy(dev_waveforms, waveforms, num_wf * wf_length * sizeof(float),
cudaMemcpyHostToDevice) );
cutilSafeCallNoSync( cudaMemcpy(dev_delays, delays, num_wf * sizeof(int),
cudaMemcpyHostToDevice) );
////////////////////////
// Kernel Call
////////////////////////
kernel_wrapper<float>(dev_waveforms, dev_focused, dev_delays,
wf_length, num_wf, threads, blocks, kernel);
//copy back to host memory.
cutilSafeCallNoSync( cudaMemcpy(focused, dev_focused, J * wf_length * sizeof(float),
cudaMemcpyDeviceToHost) );
}
繰り返しますが、これは実行が十分に大きい場合にのみ失敗します。他にも奇妙なことが起こっていますが、とりあえずこれのままにしておきます。
ああ、私はVisual Studio2010を使用してWindows7で開発しています。私のGPUはビデオカードとしても機能しており、これが奇妙な影響を与えるのではないかと心配しています。
前もって感謝します!