当常量不是数组时,cudaMemcpyToSymbol 失败

use*_*017 1 cuda

所有发布的代码示例中的 CUDA 常量内存似乎都是数组,但我在文档中找不到它作为要求。那么为什么 cudaMemcpyToSymbol 在以下情况中会因 cudaErrorInvalidSymbol 而失败:

    __constant__ int dev;

int main()
{
    int host = 2;
    cudaError_t error = cudaMemcpyToSymbol(&dev, &host, sizeof(host));
    printf(cudaGetErrorString(error));
}
Run Code Online (Sandbox Code Playgroud)

而以下成功?

    __constant__ int dev[1];

int main()
{
    int host = 2;
    cudaError_t error = cudaMemcpyToSymbol(dev, &host, sizeof(host));
    printf(cudaGetErrorString(error));
}
Run Code Online (Sandbox Code Playgroud)

Rob*_*lla 5

设备符号不像普通的主机代码 C 变量或地址。无论是“普通”设备变量还是数组,都可以使用符号名称。

改为这样做:

    __constant__ int dev;

int main()
{
    int host = 2;
    cudaError_t error = cudaMemcpyToSymbol(dev, &host, sizeof(host));
    printf(cudaGetErrorString(error));
}
Run Code Online (Sandbox Code Playgroud)

我所做的就是删除前面的&符号 dev

  • 不确定我可以详细说明很多。设备 **symbol** 与可在主机代码中寻址的普通主机地址不同。首先,它是一个设备位置,其次是通过符号表查找而不是普通的 C/C++ 指针寻址机制在幕后引用它。`cudaMemcpy...Symbol` 函数执行此设备符号表查找,然后在运行时发现设备地址。在这种情况下,获取设备符号的地址 (`&`) 是不合理的。 (2认同)