我正在将数据传输到特定的CUDA符号,我的CUDA版本是10.1,GPU是Tesla K80。我在VS2017上编译了代码,由compute_35和sm35生成了代码。当我这样写代码时,
<.h>
#include <cuda_runtime.h>
__device__ __constant__ float scoreRatio;
<.cpp>
const float ScoreRatio;
cudaErr=cudaMemcpyToSymbol(&scoreRatio,&ScoreRatio,sizeof(ScoreRatio));
printf("%d: %s.\n",cudaErr,cudaGetErorString(cudaErr));
它编译良好,但是在运行程序时得到cudaErrInvalidSymbol
,
13: Invalid device symbol
如果我这样修改我的代码,
<.h>
#include <cuda_runtime.h>
__device__ __constant__ float scoreRatio;
<.cpp>
const float ScoreRatio;
cudaErr=cudaMemcpyToSymbol(scoreRatio,&ScoreRatio,sizeof(ScoreRatio));
然后由于参数类型不兼容,编译将失败,因为当函数询问VOID *时,第一个参数是FLOAT,在这里我在cuda_runtime_api.h中找到了函数定义,
extern __host__ cudaError_t CUDARTAPI cudaMemcpyToSymbol(const void *symbol, const void *src, size_t count, size_t offset __dv(0), enum cudaMemcpyKind kind __dv(cudaMemcpyHostToDevice));
任何人都可以给我一些建议,谢谢。
答案 0 :(得分:1)
此:
<.h>
#include <cuda_runtime.h>
__device__ __constant__ float scoreRatio;
<.cpp>
const float ScoreRatio;
cudaErr=cudaMemcpyToSymbol(&scoreRatio,&ScoreRatio,sizeof(ScoreRatio));
printf("%d: %s.\n",cudaErr,cudaGetErorString(cudaErr));
是非法/错误的两种方式。您必须使用nvcc通过设备代码识别轨迹来编译代码,并且cudaMemcpyToSymbol
调用的第一个参数不正确。如果您只是简单地将.cpp
源文件重命名为具有.cu
文件扩展名并更改内容,使其看起来像这样:
<.cu>
#include <.h>
....
const float ScoreRatio;
cudaErr=cudaMemcpyToSymbol(scoreRatio, &ScoreRatio, sizeof(ScoreRatio));
printf("%d: %s.\n", cudaErr, cudaGetErorString(cudaErr));
它将同时编译并正确运行。有关为何需要更改cudaMemcpyToSymbol
调用的第一个参数的说明,请参见here。