2016-05-17 4 views
1

Я пытался использовать флаг CL_MEM_USE_HOST_PTR с функцией OpenCL clCreateBuffer() во избежание множественного выделения памяти. После небольшого исследования (обратное проектирование) я обнаружил, что инфраструктура вызывает функцию выделения операционной системы независимо от того, какой флаг я использую.OpenCL allcoation flag CL_MEM_USE_HOST_PTR использование не ссылается на мой указатель

Возможно, моя концепция не так? Но из документации предполагается использовать DMA для доступа к памяти хоста вместо выделения новой памяти.

Я использую OpenCL 1.2 на устройстве Intel (HD5500)

+0

Какая реализация? Beignet? – user3528438

+0

Нет, я использую opencl-реализацию на окнах. – user6345890

ответ

2

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

использовать что-то вроде:

void *host_ptr = _aligned_malloc(align_to(size,4096),4096)); 

Here's a good article for this: В "Key Takeaways".

Если у вас уже есть данные и хотите, чтобы загрузить данные в OpenCL объект буфера, а затем использовать CL_MEM_USE_HOST_PTR с буфером, выделяющегося при граничной 4096 байт (выровнен на страницы и строки кэша границы) и а общий размер, который кратен 64 байтам (размер строки кеша).

Вы также можете использовать CL_MEM_ALLOC_HOST_PTR и позволить драйверу передать распределение. Но чтобы получить указатель, вам придется сопоставлять и развязывать его (но при отсутствии стоимости копирования).

+0

tnx. это сработало! – user6345890

+0

Означает ли это, что реализация исправляет ошибку, которую разработчик забыл сделать ее кратной 64? Можем ли мы доверять другим корпорациям, таким как AMD, NVIDIA, ..? –

+0

Я так думаю, но я не уверен. Даже с 'ALLOC_HOST_POINTER', я бы обеспечил округление до 64-байтного множества. Можно было бы это проверить. – Tim

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