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



我对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--] = '';
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("%sn", inp);
printf("%sn", buff);
}
cudaDeviceReset();
return 0;
}

这是上面代码的输出:

abc
abc1
abc12
abc123
abc1234
abc12345
abc123456
abc1234567
abc12345678
abc123456789

请帮帮我。

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

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

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

应该用代替

memcpy(buff, inp, size+1);

感谢@talonmies的建议。

最新更新