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