3

ホストがコピーしたメモリに簡単にアクセスできるように、コードを記述し、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を宣言したままにして、問題が解決したと考えるのは不快です。

4

1 に答える 1

2

タイプサイズの不一致がある可能性があります。cudaPitchedPtrにはタイプsize_tのフィールドがいくつかあります。したがって、ホスト側でsizeof(size_t)が8バイトであり、デバイス上でこれが4バイトである場合、問題が発生する可能性があります。これは、より多くのメモリが割り当てられるため、別のpitchedPtrを定義することで問題が解決する理由も説明できます。

于 2012-08-31T21:20:29.993 に答える