Squeak.ru - шаблоны программирования

Как использовать закрепленную память/отображенную память в OpenCL

Чтобы сократить время передачи от хоста к устройству для моего приложения, я хочу использовать закрепленную память. рекомендации NVIDIA предлагает сопоставление буферов и запись данных используя следующий код:

cDataIn = (unsigned char*)clEnqueueMapBuffer(cqCommandQue, cmPinnedBufIn, CL_TRUE,CL_MAP_WRITE, 0, memSize, 0, NULL, NULL, NULL);

for(unsigned int i = 0; i < memSize; i++) 
{ 
    cDataIn[i] = (unsigned char)(i & 0xff); 
}

clEnqueueWriteBuffer(cqCommandQue, cmDevBufIn, CL_FALSE, 0, 
szBuffBytes, cDataIn, 0, NULL, NULL);

руководство Intel по оптимизации рекомендует использовать вызовы clEnqueueMapBuffer и clEnqueueUnmapBuffer вместо вызовов clEnqueueReadBuffer или clEnqueueWriteBuffer.

Как правильно использовать закрепленную/сопоставленную память? Нужно ли записывать данные с помощью enqueueWriteBuffer или достаточно enqueueMapBuffer?

Кроме того, в чем разница между CL_MEM_ALLOC_HOST_PTR и CL_MEM_USE_HOST_PTR?


Ответы:


1

Это интересная тема, которую мало кто подробно описывает. Я постараюсь точно определить, как это работает.

Закрепленная память относится к памяти, которая не только находится в устройстве, но и существует в хосте, поэтому запись DMA возможна между этими двумя блоками памяти. Увеличение производительности копирования. Поэтому ему нужно CL_MEM_ALLOC_HOST_PTR в параметрах создания буфера.

С другой стороны, CL_MEM_USE_HOST_PTR возьмет указатель хоста для создания буфера, из спецификации неясно, может ли это быть закрепленной памятью. Но вообще говоря, это НЕ должно быть закрепленной памяти, созданной таким образом, поскольку указатель хоста не был зарезервирован API OpenCL и не ясно, где он находится в памяти.


Что касается вопроса Карта/Чтение. Оба в порядке. И они дадут одинаковую производительность. Разница между обоими методами заключается в том, что:

  • Для сопоставления/удаления: необходимо сопоставить перед записью/чтением и отменить сопоставление после этого. Таким образом, вы обеспечиваете согласованность данных. Это вызовы API, и они требуют времени для выполнения, а также являются асинхронными. Хорошо то, что вам не нужно хранить ничего, кроме объекта буфера.
  • Для Map+Read/Write: при создании зоны памяти вам нужно сделать Map и сохранить значение указателя. Тогда при уничтожении буфера нужно сначала Unmap, а потом уничтожить. Вам нужно удерживать buffer+Mapped_Buffer все время. Хорошо, что теперь вы можете просто clEnqueueRead/Write перейти к этому сопоставленному указателю. API будет ждать, пока закрепленные данные станут непротиворечивыми, а затем посчитает, что это сделано. Его проще использовать, так как это похоже на создание карты + удаление карты одним выстрелом.

Режим чтения/записи проще в использовании, особенно для повторяющихся операций чтения, но он не так универсален, как ручной вариант карты, поскольку вы НЕ МОЖЕТЕ ни записать карту read only, ни прочитать карту write only. Но для общего использования переменные, которые читаются, никогда не будут записаны, и наоборот.


Насколько я понимаю, рекомендация Intel относится к "Использовать карту, а не простое чтение/запись", а не "При использовании карты не используйте чтение/запись по сопоставленным указателям"< /сильный>.

Вы проверили эту рекомендацию nVIDIA по аппаратному обеспечению Intel? Я думаю, что это должно работать, однако я не знаю, действительно ли работа будет оптимальной (как в AMD или nVIDIA HW).

11.06.2014
  • действительно странно, что вам нужно использовать clEnqueueWriteBuffer() вместе с Map/Unmap. Поскольку, когда вы выполняете Map, а затем меняете указатель хоста, вы фактически меняете данные как CPU, так и GPU. Когда вы делаете unmap, данные будут синхронизированы между CPU и GPU. Я не понимаю, зачем вам выполнять clEnqueueWriteBuffer между MAP+change cDataIn и UNMAP. Очень странно... 27.05.2016
  • Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...


    © 2024 squeak.ru, Squeak.ru - шаблоны программирования