将数据从CPU传输到GPU,反之亦然?

时间:2019-07-10 10:06:08

标签: cuda gpu cpu

我是CPU和GPU编程的新手。 我了解到cudamalloc和cudamemcpy传输CPU(主机)数据 到GPU(设备),但是我想确切地知道从哪个内存到哪个内存(如果确实是内存而不是寄存器,因为我不确定,因为我不确定),因为我读到GPU有不止一种记忆。

1 个答案:

答案 0 :(得分:2)

cudaMalloc函数在GPU的设备全局内存中分配请求的字节数,并返回指向该内存块的初始化指针。 cudaMemcpy需要4个参数:

  1. 指向目标内存的指针的地址 复制即可完成。
  2. 源地址
  3. 字节数
  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处理完成后,结果将传回主机。这些操作显示在上面的代码片段中。