Ваша проблема в том, что d_test
(как это показано в таблице символов хоста) не является допустимым адресом устройства, и среда выполнения не может получить к нему прямой доступ. Решение состоит в том, чтобы использовать функцию API cudaGetSymbolAddress
для считывания адреса символа устройства из контекста во время выполнения. Вот несколько расширенная версия демонстрационного кейса, которая должна работать правильно:
#include <stdio.h>
#include <stdlib.h>
#include <cuda_runtime.h>
// device variable and kernel
__device__ float d_test;
inline void gpuAssert(cudaError_t code, char * file, int line, bool Abort=true)
{
if (code != cudaSuccess) {
fprintf(stderr, "GPUassert: %s %s %d\n", cudaGetErrorString(code),file,line);
if (Abort) exit(code);
}
}
#define gpuErrchk(ans) { gpuAssert((ans), __FILE__, __LINE__); }
int main()
{
float * _d_test;
gpuErrchk( cudaFree(0) );
gpuErrchk( cudaGetSymbolAddress((void **)&_d_test, "d_test") );
gpuErrchk( cudaMemset(_d_test,0,sizeof(float)) );
gpuErrchk( cudaThreadExit() );
return 0;
}
Здесь мы читаем адрес символа устройства d_test
из контекста в указатель хоста _d_test
. Затем его можно передать API-функциям на стороне хоста, таким как cudaMemset
, cudaMemcpy
и т. Д.
Отредактируйте, чтобы отметить, что форма cudaGetSymbolAddress
, показанная в этом ответе, устарела и удалена из API времени выполнения CUDA. Для современной CUDA вызов будет:
gpuErrchk( cudaGetSymbolAddress((void **)&_d_test, d_test) );