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)) );

源代码有什么问题吗?实际上这段代码来自 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];
4

1 回答 1

2

kk_d编译器下方的代码并运行正常,但在替换时重现您的错误"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};主机代码允许复制 via cudaMemcpyToSymbol(ff, rr, 8);,它编译和运行正常,即使在sm_13.

也许错误源于较早的代码,或者来自您的h_ff_variable?

于 2012-11-29T09:36:00.260 回答