0

cudaMemcpyToSymbol の使用に問題があります。うまく動作するコードがあります。私のコードの削減バージョンは次のとおりです。

mykernel.h file:
__global__ 
void foo(float* out);

mykernel.cu file:
#include "kernels.h"
__global__ 
void foo(float* out)
{
    uint32_t idx = blockIdx.x * blockDim.x + threadIdx.x;
    out[idx] = 10;
}

main.cu file:
#include "kernels.h"
main()
{
    // initialization and declaration stuff here

    foo<<<1,1,1>>>(my_global_memory);

    // read back global memory and investigate values
}

上記のコードは完璧に機能します。ここで、この「10」の値を定数メモリからの値に置き換えたいと思います。だから私がしたことは:

  • __constant__ float my_const_var;mykernel.h ファイルに追加します。
  • カーネルの最後の行をout[idx] = my_const_var;mykenel.cu に置き換えます
  • float value = 10.0f; cudaMemcpyToSymbol(my_const_var,&value);main.cu の呼び出しの前に追加

すべてを実行した後、「10」ではなく「0」の結果が得られるため、cudaMemcpyToSymbol が実際の値をコピーしていないように見えます。さらに、私は常に CUDA エラーをチェックしていますが、エラーはありません。誰かが私が間違っていることを教えてもらえますか? cudaMemcpyToSymbol が値をシンボルにコピーしないのはなぜですか? Debian Linux と CUDA SDK 5.0 の最新ドライバーで GeForce9600M (コンピューティング機能 1.1) を使用しています。cuda-memcheck も実行してみましたが、エラーは発生しません。

4

1 に答える 1

3

別のコンパイル ユニットで定義されている 1 つのコンパイル ユニットの変数にアクセスしようとしているため、(main.cuおよびmykernel.cu) これには別のデバイス コンパイルが必要になります。

5.0 リリースより前は、CUDA は個別のコンパイルをサポートしていなかったため、CUDA コードはデバイス関数を呼び出したり、ファイル間で変数にアクセスしたりできませんでした。

残念ながら、個別のコンパイルは、コンピューティング機能 2.0 以上のデバイスでのみ利用できます。

個別のコンパイルは sm_20 以降でのみ機能します。

cc2.0 より前のバージョンでは、特定の変数を参照する必要があるすべての CUDA コードを同じファイル (変数が宣言されている同じファイル) に置くことで、この問題を回避できます。

于 2013-09-20T16:53:39.507 に答える