我是CPU和GPU编程的新手。 我了解到cudamalloc和cudamemcpy传输CPU(主机)数据 到GPU(设备),但是我想确切地知道从哪个内存到哪个内存(如果确实是内存而不是寄存器,因为我不确定,因为我不确定),因为我读到GPU有不止一种记忆。
答案 0 :(得分:2)
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处理完成后,结果将传回主机。这些操作显示在上面的代码片段中。