2

cudaバイナリを実行すると、「無効なデバイスシンボル」というメッセージが表示されます。コンパイル中にエラーは発生しませんでした。メッセージは以下にあります。

Cuda error in file 'euler3d.cu' in line 416 : invalid device symbol.

また、関連するソースコードは以下のとおりです。

CUDA_SAFE_CALL( cudaMemcpyToSymbol(ff_variable, h_ff_variable, NVAR*sizeof(float)) );

ソースコードに問題はありますか?実際、このコードはロディニアv2.1、cfdベンチマークプログラムからのものです。私はcudaバージョン3.1を使用しており、次のオプションでコンパイルしました。

nvcc -Xptxas -v -O3 --gpu-architecture=compute_13 --gpu-code=compute_13 euler3d.cu -o euler3d -I$(CUDA_SDK_PATH)/common/inc  -L$(CUDA_SDK_PATH)/lib $(CUTIL_LIB)

ff_variable関連のコードはここにあります。

#define NDIM 3
#define VAR_MOMENTUM  1
#define VAR_DENSITY_ENERGY (VAR_MOMENTUM+NDIM)
#define NVAR (VAR_DENSITY_ENERGY+1)
__constant__ float ff_variable[NVAR];
4

1 に答える 1

2

kk_dコンパイラの下のコードは正常に実行されますが、 withを置き換えるとエラーが再現されます"kk_d"(つまり、コンパイルされますがinvalid device symbol、実行時にレポートされます)。CUDAリファレンス (v. 4.2)は、最初の引数は実際には const リテラルである必要があると述べているため、ここでは少し誤解を招きます。

#include <cstdio>
#include "XFC_cudaError.cuh"   //my error reporting

__device__ int kk_d;

__global__ void foo() {
  printf("%i ", kk_d);
}

int main() {
  int kk = 10;
  cudaMemcpyToSymbol(kk_d, &kk, 4);
  CUDA_CHK;
  foo<<<1,1>>>();
  CUDA_CHK;
  cudaDeviceSynchronize();
}

これで、コードを適切に変更できるはずです。printfでコンパイルされないことに注意してくださいarch=sm_13。少なくとも が必要ですがsm_20、これは問題とは関係ありません。

あなたの編集では:配列をコピーするための構文は...あなたのコードとまったく同じです。具体的に__constant__ float ff[2];は、グローバル デバイス変数とfloat rr[] = {1,2};ホスト コードに追加すると、 を介したコピーが可能になりcudaMemcpyToSymbol(ff, rr, 8);、 でコンパイルして問題なく実行できますsm_13

おそらく、エラーは以前のコードまたはあなたのh_ff_variable?

于 2012-11-29T09:36:00.260 に答える