根据其他问题和链接所述,您不能再使用符号名称来调用此函数。现在该功能已经消失,那么什么情况下会优先选择使用这个函数而不是cudaMemCpy
?您何时需要使用它?有哪些权衡或好处?
根据其他问题和链接所述,您不能再使用符号名称来调用此函数。现在该功能已经消失,那么什么情况下会优先选择使用这个函数而不是cudaMemCpy
?您何时需要使用它?有哪些权衡或好处?
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获取地址? - rubixibuc__constant__
是 CUDA 中的存储类说明符,表示该符号位于 GPU DRAM 的特殊缓存、只读部分。它与 const 完全独立。你不能使用&coeffs
,因为那会暗示符号在主机内存中的地址而不是 GPU 内存,而 API 调用需要的是 GPU 内存中的地址。 - talonmies__device__
声明的变量? - rubixibuc__device__
指针和静态声明的设备符号。 - talonmies