【发布时间】:2020-02-01 00:01:49
【问题描述】:
正如其他问题和链接所述,您不能再为此功能使用符号名称。现在这个功能已经消失了,什么时候想在cudaMemCpy 上使用它?您什么时候想使用它?权衡或好处是什么?
【问题讨论】:
标签: cuda
正如其他问题和链接所述,您不能再为此功能使用符号名称。现在这个功能已经消失了,什么时候想在cudaMemCpy 上使用它?您什么时候想使用它?权衡或好处是什么?
【问题讨论】:
标签: cuda
简而言之,因为cudaMemcpy 无法在没有额外 API 调用的情况下做与cudaMemcpyToSymbol 相同的事情。考虑一个常量内存数组:
__constant__ float coeffs[8];
要使用cudaMemcpyToSymbol 将值复制到此数组,只需这样做
cudaMemcpyToSymbol(coeffs, hostData, 8*sizeof(float));
要对cudaMemcpy 执行相同操作,需要这样做:
float *dcoeffs;
cudaGetSymbolAddress((void **)&dcoeffs, coeffs);
cudaMemcpy(dcoeffs, hostData, 8*sizeof(float), cudaMemcpyHostToDevice);
直接调用cudaMemcpy 是非法的,没有事先进行符号查找。
[标准免责声明:所有代码在浏览器中编写,无需访问文档或编译器,使用风险自负]
【讨论】:
__constant__内存和方法签名中指向const的参数类型指针是什么关系。 __constant__ 有指向 const 的指针吗?还有,为什么不能直接用 &coeffs 来获取地址呢?
__constant__ 是 CUDA 中的存储类说明符,表示符号位于 GPU DRAM 的特殊缓存只读部分中。它完全独立于 const。您不能使用&coeffs,因为这将暗示符号的地址在主机内存中而不是GPU内存,这是API调用所需要的
__device__ 声明的变量?
__device__ 指针和静态声明的设备符号。