CUDA函数cudaMemcpyToSymbol()中的问题

时间:2019-07-05 01:25:54

标签: cuda

我正在将数据传输到特定的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));

任何人都可以给我一些建议,谢谢。

1 个答案:

答案 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