当我运行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];
答案 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
?