你的问题是d_test
(如主机符号表中所示)不是有效的设备地址,运行时无法直接访问它。解决方案是使用cudaGetSymbolAddress
API函数用于在运行时从上下文中读取设备符号的地址。这是演示案例的稍微扩展版本,它应该可以正常工作:
#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
, etc.
编辑要注意的形式cudaGetSymbolAddress
此答案中显示的内容已被弃用并从 CUDA 运行时 API 中删除。对于现代 CUDA,调用将是:
gpuErrchk( cudaGetSymbolAddress((void **)&_d_test, d_test) );