【问题标题】:CUDA: Unable to copy character array from host to unified device memory using cudaMemcpyToSymbolCUDA:无法使用 cudaMemcpyToSymbol 将字符数组从主机复制到统一设备内存
【发布时间】:2020-05-07 19:15:08
【问题描述】:

我对 Cuda 编程很陌生。我正在尝试将字符数组从主机复制到统一设备内存。该代码不会抛出任何错误,而是将设备的内存显示为空行。

int main(int argc, char **argv)
{
    int i = 0, n = 0;
    unsigned char * buff;
    char inp[512] = "abc";
    n = 10;

    while (i < n)
    {
         int num = i, size = 0;
         while(num > 0)
         {
             ++size;
             num /= 10;
         }
         size += strlen(inp);
         num = i;
         inp[size--] = '\0';
         while(num > 0)
         {
              inp[size--] = '0' + num%10;
              num /= 10;
         }
         size = strlen(inp);
         cudaMallocManaged(&buff, (size+1)*sizeof(char));
         cudaMemcpyToSymbol(buff, &inp, sizeof(inp), 0, cudaMemcpyHostToDevice);
         printf("%s\n", inp);
         printf("%s\n", buff);
    }

    cudaDeviceReset();
    return 0;
 }

这是上面代码的输出:

abc

abc1

abc12

abc123

abc1234

abc12345

abc123456

abc1234567

abc12345678

abc123456789

请帮帮我。

【问题讨论】:

  • buff 不是设备符号,在这种情况下根本不需要 cudaMemcpyToSymbol,因为您使用的是托管内存
  • 那么为此,我需要将 buff 设为设备符号吗?
  • 没有。在这种情况下,您需要完全忘记设备符号。它们与您在这种情况下尝试做的事情完全无关
  • 非常感谢。使用 memcpy 而不是 cudaMemcpyToSymbol 解决了这个问题。
  • 您是否愿意为下一个人写一个简短的答案,详细说明您的解决方案。我会很高兴地支持它。然后,可以在添加后几天接受答案,将这个问题(由您)标记为已回答

标签: cuda


【解决方案1】:

这里的buff是在统一内存中分配的,不是设备符号。因此,在这种情况下,我们需要忘记设备符号。 主机和设备可以在需要时直接访问统一内存中的数据。设备自动从统一内存中获取所需数据,无需显式将数据移动到设备内存中。

这里的问题可以通过使用 memcpy 而不是 cudaMemcpyToSymbol 来解决。 cudaMemcpyToSymbol 用于将数据写入设备内存,而不是统一内存。

cudaMemcpyToSymbol(buff, &inp, sizeof(inp), 0, cudaMemcpyHostToDevice);

应该替换为

memcpy(buff, inp, size+1);

感谢@talonmies 的建议。

【讨论】:

    猜你喜欢
    • 2016-07-25
    • 1970-01-01
    • 2017-08-27
    • 2018-03-15
    • 1970-01-01
    • 2021-07-22
    • 2014-09-23
    • 2023-03-14
    • 2013-09-20
    相关资源
    最近更新 更多