Я открыл файл в режиме 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 ГБ.