【发布时间】:2019-11-19 22:38:45
【问题描述】:
我是 CPU 和 GPU 编程的新手。 我了解 cudamalloc 和 cudamemcpy 传输 CPU(主机)数据 到GPU(设备),但我想确切地知道从哪个内存到哪个内存(如果它确实是内存而不是寄存器,因为我不确定),因为我读到GPU有不止一种记忆。
【问题讨论】:
我是 CPU 和 GPU 编程的新手。 我了解 cudamalloc 和 cudamemcpy 传输 CPU(主机)数据 到GPU(设备),但我想确切地知道从哪个内存到哪个内存(如果它确实是内存而不是寄存器,因为我不确定),因为我读到GPU有不止一种记忆。
【问题讨论】:
cudaMalloc 函数在 GPU 的设备全局内存中分配请求的字节数,并返回指向该内存块的初始化指针。 cudaMemcpy 有 4 个参数:
例如
void Add(float *A, float *B, float *C, int n)
{
int size = n * sizeof(float);
float *d_A, *d_B, *d_C;
cudaMalloc((void**) &d_A, size);
cudaMemcpy(d_A, A, size, cudaMemcpyHostToDevice);
cudaMalloc((void**) &d_B, size);
cudaMemcpy(d_B, B, size, cudaMemcpyHostToDevice);
cudaMalloc((void**) &d_C, size);
cudaMemcpy(d_C, C, size, cudaMemcpyHostToDevice);
// further processing code
........
cudaMemcpy(C, d_C, size, cudaMemcopyDeviceToHost);
.......
}
cudaMemcpyHostToDevice 和 cudaMemcopyDeviceToHost 是在 CUDA 编程环境中定义的常量。
在 CUDA 中,主机和设备具有独立的内存空间。 GPU 具有板载 DRAM,并且某些板可能具有超过 4 GB 的 DRAM,它被称为设备全局内存。要在设备上执行内核,程序员需要分配设备全局内存并将相关数据从主机传输到设备内存。 GPU 处理完成后,结果将传输回主机。这些操作在上面的代码 sn-p 中显示。
【讨论】: