CUDA:无法使用cudaMemcpyToSymbol将字符数组从主机复制到统一设备内存

时间:2020-05-07 09:21:48

标签: cuda

我对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

请帮帮我。

1 个答案:

答案 0 :(得分:2)

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

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

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

应替换为

memcpy(buff, inp, size+1);

感谢@talonmies的建议。