Я пишу программу CUDA, которая отображает растровое изображение на GPU. Данные растрового изображения сохраняются в единой памяти. При копировании данных в другой буфер (выделенный malloc) с помощью cudaMemcpy, у меня нет проблем с производительностью. Однако при использовании memcpy это занимает от 10 до 20 раз дольше. Почему такая огромная разница в производительности? Из того, что я читал в Интернете, cudaMemcpy внутренне вызывает memcpy при копировании из объединенной памяти в память хоста. Это неправильно?
РЕДАКТИРОВАТЬ: Я на Windows, CUDA версия 10.
Код, используемый для тестирования:
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <memory.h>
#include <malloc.h>
#include <stdio.h>
#include <time.h>
#define SIZE (1920 * 1080 * 4)
int main()
{
void* buffer_d;
cudaMallocManaged(&buffer_d, SIZE);
void* buffer_h = malloc(SIZE);
long start = 0, end = 0;
start = clock();
cudaMemcpy(buffer_h, buffer_d, SIZE, cudaMemcpyDefault);
end = clock();
printf("cudaMemcpy time in ms: %ld\n", end - start);
start = clock();
memcpy(buffer_h, buffer_d, SIZE);
end = clock();
printf("memcpy time in ms: %ld\n", end - start);
cudaFree(buffer_d);
free(buffer_h);
return 0;
}
Выходные данные:
cudaMemcpy time in ms: 2
memcpy time in ms: 48