2016-06-15 2 views
-2

Привет Я хочу, чтобы выделить возлагали память, но не с помощью cudaMallocHost, я прочитал this post и пытался использовать фиксированный ММАП подражать «cudaMallocHost»:Что эквивалентно реализации системы API для cudaMallocHost

data_mapped_ = (void *)mmap(NULL, sb.st_size, PROT_READ, MAP_SHARED, fd_, 0); 
if(munmap(data_mapped_, sb.st_size) == -1) { 
    cerr << "munmap failed" << endl; 
    exit(-1); 
} 

data_mapped_ = (void *)mmap(data_mapped_, sb.st_size, PROT_READ, MAP_SHARED|MAP_FIXED, fd_, 0); 

Но это все еще не так быстро, как cudaMallocHost. Итак, какова правильная реализация приложения закрепленной памяти?

+0

C и C++ - ** разные ** языки. Ваш код не C и CUDA не основаны на C! – Olaf

+0

@ Олаф делает это? –

+0

Если вы должны спросить об этом, вы не знаете, по крайней мере, на двух языках недостаточно. Я бы порекомендовал вам остаться с C++/CUDA. (честно без обид!) – Olaf

ответ

0

CUDA закрепленная память (например, эти указатели, возвращенные cudaMallocHost, cudaHostAlloc, или cudaHostRegister) имеют несколько характеристик. Одна из характеристик заключается в том, что она не подвержена риску, и эта характеристика во многом обеспечивается базовыми вызовами системы/ОС.

Другая характеристика: зарегистрирован с драйвером CUDA. Эта регистрация означает, что водитель отслеживает начальный адрес и размер закрепленного выделения. Он использует эту информацию, чтобы точно определить, как она будет обрабатывать будущие вызовы API, которые касаются этого региона, например cudaMemcpy или cudaMemcpyAsync.

Возможно, вы можете обеспечить нестранимый аспект, выполнив собственные системные вызовы. Единственный способ выполнить функцию регистрации драйверов CUDA - это фактически вызвать один из вышеупомянутых вызовов API CUDA.

Поэтому не существует последовательности исключительно вызовов библиотеки C или системной библиотеки, которые могут полностью имитировать поведение одного из вышеупомянутых вызовов API CUDA, которые обеспечивают «закрепленную» память.

Смежные вопросы