Передача данных из CPU в GPU и наоборот, где именно? - PullRequest
0 голосов
/ 10 июля 2019

Я новичок в программировании CPU и GPU.Я понял, что cudamalloc и cudamemcpy переносят данные CPU (хоста) в GPU (устройство), но я хочу точно знать, из какой памяти в какую память (если это действительно память, а не регистр, потому что я не уверен),потому что я прочитал, что у GPU есть более одного вида памяти.

1 Ответ

2 голосов
/ 10 июля 2019

Функция cudaMalloc выделяет запрошенное количество байтов в глобальной памяти устройства графического процессора и возвращает инициализированный указатель на этот кусок памяти.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 хост и устройство имеют отдельные области памяти.Графические процессоры имеют встроенную DRAM, а на некоторых платах может быть более 4 ГБ DRAM, это известно как Device Global Memory.Чтобы запустить ядро ​​на устройстве, программист должен выделить Device Global Memory и перенести соответствующие данные с хоста на память устройства.После завершения обработки графическим процессором результат передается обратно на хост.Эти операции показаны во фрагменте кода выше.

...