ホストがコピーしたメモリに簡単にアクセスできるように、コードを記述し、cudaMemcpyToSymbol
一部cudaPitchedPtrs
を(プロセスごとに複数の)GPUデバイスにコピーするために使用しています。しかし、効果的に回避する方法がわからないという非常に奇妙なバグを見つけました(私はそれを呼ぶのをためらっていますが、別の説明はありません)。これが私のコードの責任の一部です:
したがって、main.cのmain()からgpu_kernels.cuのinit_gpu()を呼び出します(init_gpuには通常のextern "C"
フレームワークがありますが、これを削除したため、以下の問題には影響しませんでした)。gpu_utilities.cuは、gpu_decs.hを含む唯一のファイルです(すべてのCUDAソースをgpu_kernels.cuにインライン化します)。
さて、これがgpu_decs.hのセグメントです:
__constant__ struct cudaPitchedPtr rad_gpu;
//__constant__ struct cudaPitchedPtr test_pptr;
この2行目がコメント化されると、次のcudaMemcpyToSymbol操作がエラーコード11で失敗します。
cudaErrorCheck(cudaMemcpyToSymbol(rad_gpu,
&((*gpu_rad_parms)[n].dstPtr), sizeof(struct cudaPitchedPtr),
cudaMemcpyHostToDevice), "init_gpu - rad_gpu - symbol");
ただし、test_pptr(コード内のどこでも定義または使用されることはありません)のコメントを解除しても、この行はエラーをスローしません。test_pptrのタイプは、charよりも大きい限り、問題ではないようです(これは正しくない可能性があります。問題を完全に特徴付けていません)。
興味深いのは、この行がないと、rad_gpuがgpu_decs.hの最後の__constant__宣言であるということです。ただし、このエラーはまだ私には意味がありません。誰かが以前にこの問題の話を見たり聞いたりしたことがあり、それを解決するための信頼できる方法がありますか?test_pptrを宣言したままにして、問題が解決したと考えるのは不快です。