cudaHostRegister возвращает cudaErrorInvalidValue - PullRequest
0 голосов
/ 05 декабря 2018

Я открыл файл в режиме READONLY.Сопоставили его в памяти хоста, используя mmap следующим образом

uint8_t *data_ptr = (uint8_t *) mmap(NULL,NumOfBytes,PROT_READ,MAP_PRIVATE, file_descriptor, 0);

Mmap возвращается без ошибки.

Теперь я хочу заблокировать память, используя cudaHostRegister, чтобы я могиспользуйте data_ptr в API CUDA cudaMemcpyAsync (..)

cudaHostRegister(data_ptr,NumOfBytes,cudaHostRegisterDefault);

cudaHostRegister возвращает ошибку, т.е. cudaErrorInvalidValue

В описании cudaErrorInvalidValue говоритсяследующее:

Это указывает на то, что один или несколько параметров, переданных в вызов API, не находятся в допустимом диапазоне значений

Кто-нибудь знает, почему вышеуказанная функцияжалуется?

Редактировать 1:

mmap не возвращает физическое местоположение сопоставленного файла, поэтому я взял два указателя.Один для malloc и другой для отображения файла.

/* This ptr will hold the physical location of the file */
    ptr = malloc(size)

/* Virtual address of mapped file */
    tmp_ptr = mmap(file)

/* Copy the contents of file to the ptr */
    memcpy(ptr,tmp_ptr,size)

/* unmapping the file */
    munmap(tmp_ptr,..)

/* Register the ptr */
    cudaHostRegister(ptr,size,..)

Этот метод работал, но с этим подходом есть две проблемы.

1) memcpy занимает много времени для больших файлов.

2) memcpy не удается ( ошибка сегментации ) для файлов ~ 4 ГБ.

Хотя у меня есть свободное место в памяти ~ 10 ГБ.

1 Ответ

0 голосов
/ 12 декабря 2018

Подход, который работал для меня, заключается в следующем:

1) сопоставил файл с помощью mmap

2) закрепил его с помощью mlock

3)Зарегистрировано с помощью cudaHostRegister

...