Проблемы в функции CUDA cudaMemcpyToSymbol () - PullRequest
0 голосов
/ 05 июля 2019

Я переношу данные на определенный символ 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));

тогда компиляция не удалась бы из-за несовместимого типа параметра, поскольку первый параметр - FLOAT, а функция запрашивает VOID *, здесь я нашел определение функции в 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));

CouldКто-нибудь, пожалуйста, дайте несколько советов, высоко ценится.

1 Ответ

1 голос
/ 05 июля 2019

Это:

<.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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...