【问题标题】:cudaMemcpyToSymbol vs. cudaMemcpy why is it still around (cudaMemcpyToSymbol)cudaMemcpyToSymbol vs. cudaMemcpy 为什么它仍然存在 (cudaMemcpyToSymbol)
【发布时间】:2020-02-01 00:01:49
【问题描述】:

正如其他问题和链接所述,您不能再为此功能使用符号名称。现在这个功能已经消失了,什么时候想在cudaMemCpy 上使用它?您什么时候想使用它?权衡或好处是什么?

https://docs.nvidia.com/cuda/cuda-runtime-api/group__CUDART__MEMORY.html#group__CUDART__MEMORY_1g9bcf02b53644eee2bef9983d807084c7

【问题讨论】:

    标签: cuda


    【解决方案1】:

    简而言之,因为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 是非法的,没有事先进行符号查找。

    [标准免责声明:所有代码在浏览器中编写,无需访问文档或编译器,使用风险自负]

    【讨论】:

    • ty,__constant__内存和方法签名中指向const的参数类型指针是什么关系。 __constant__ 有指向 const 的指针吗?还有,为什么不能直接用 &coeffs 来获取地址呢?
    • __constant__ 是 CUDA 中的存储类说明符,表示符号位于 GPU DRAM 的特殊缓存只读部分中。它完全独立于 const。您不能使用&coeffs,因为这将暗示符号的地址在主机内存中而不是GPU内存,这是API调用所需要的
    • 指针变量 coeffs 指向的地址在哪里,该地址的副本会将内存指向哪里?这是否也适用于使用__device__ 声明的变量?
    • 通过 CUDA API 复制到该地址将失败并出现无效参数错误,因为它不是 API 先前分配的 GPU 内存空间中的地址。是的,这也适用于通用 __device__ 指针和静态声明的设备符号。
    • API 是否区分使用 cudaGetSymbolAddress 获取指针的设备地址和非指针设备变量。当您进行调用时,它是否采用内存中实际指针变量的地址,或者所指向的内存的起始地址?这与获取标准 int 设备变量的地址相比如何?
    猜你喜欢
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    • 2013-11-07
    • 2010-11-18
    • 2014-10-09
    • 2012-05-11
    • 2018-02-08
    • 1970-01-01
    相关资源
    最近更新 更多