我对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
请帮帮我。
答案 0 :(得分:2)
此处,buff分配在统一内存中,而不是设备符号。因此,在这种情况下,我们需要忘记设备符号。 主机和设备可以根据需要直接访问统一内存中的数据。该设备自动从统一内存中获取所需的数据,而无需将数据显式移动到设备内存中。
使用memcpy而不是cudaMemcpyToSymbol可以解决这里的问题。 cudaMemcpyToSymbol用于将数据写入设备内存,而不是统一内存。
cudaMemcpyToSymbol(buff, &inp, sizeof(inp), 0, cudaMemcpyHostToDevice);
应替换为
memcpy(buff, inp, size+1);
感谢@talonmies的建议。