【问题标题】:cuda error message : invalid device symbolcuda 错误消息:无效的设备符号
【发布时间】:2017-11-29 17:37:24
【问题描述】:

我在运行 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];

标签: cuda


【解决方案1】:

编译器下方的代码并运行正常,但在将 kk_d 替换为 "kk_d" 时重现您的错误(即它编译,但在运行时报告 invalid device symbol)。 CUDA reference (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

【讨论】:

  • 感谢您的回答。你的意思是如果 ff_variable 是 global const 而 h_ff_variable 是 local float,错误可能来自其他代码,对吧?
  • @user1292251 如果这回答了您的问题,请接受它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多