cuda错误消息:无效的设备符号

时间:2012-11-29 05:14:19

标签: cuda

当我运行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)) );

源代码是否有任何错误?实际上这段代码来自Rodinia 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];

1 个答案:

答案 0 :(得分:2)

编译器下面的代码并运行正常,但是在用kk_d替换"kk_d"时重现您的错误(即它编译,但在运行时报告invalid device symbol)。 CUDA reference (v. 4.2)在这里有点误导,因为它说第一个参数确实应该是一个常量字面。

#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