CUDA унифицированная память memcpy () производительность - PullRequest
1 голос
/ 03 ноября 2019

Я пишу программу 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
...