调用cudaMemcpyFromSymbol 出现cudaErrorInvalidSymbol
原因:
cudaError_t cudaMemcpyFromSymbol ( void* dst, const T& symbol, size_t count, size_t offset = 0, cudaMemcpyKind kind = cudaMemcpyDeviceToHost )
参数 symbol 必须为_ device 全局变量本身,不能通过函数参数传入,如
_ _ host_ _ void myCopySymbol(const void* symbol, void* h_data, int size)
{
…
cudaMemcpyFromSymbol (h_data,symbol,size);
}
上述做法是错误的。
如果想实现symbol的入参,需要先通过cudaGetSymbolAddress获取symbol的全局内存指针,如下
_ _ host_ _ void myCopySymbol(const void* symbol, void* h_data, int size)
{
…
cudaMemcpy (h_data,symbol,size,cudaMemcpyDeviceToHost);
}
void main()
{
int size = 10000;
float * h_data = new float [size];
float *symbol;
cudaGetSymbolAddress((void**)&symbol,DEV_VAR);
myCopySymbol(symbol,h_data,sizeof(float)*size );
}