Ответ 1
Это интересная тема, в которой очень мало деталей. Я попытаюсь точно определить, как это работает.
Прикрепленная память относится к памяти, которая также находится на устройстве, существует в хосте, поэтому между этими двумя памятью возможна запись DMA. Увеличение производительности копии.
Вот почему в параметрах создания буфера требуется CL_MEM_ALLOC_HOST_PTR
.
С другой стороны, CL_MEM_USE_HOST_PTR
будет принимать указатель хоста для создания буфера, это неясно спецификацией, если это может или не может быть закрепленной памятью. Но, вообще говоря, он не должен быть закрепленной памятью, созданной таким образом, поскольку указатель узла не был зарезервирован API OpenCL и не ясен, где он находится в памяти.
Относительно вопроса "Карта/Чтение". Оба в порядке. И они дадут такую же производительность. Разница между обоими методами заключается в том, что:
- Для карты /Unmap : вам нужно нарисовать карту перед записью/чтением и затем распаковать. Таким образом, вы обеспечиваете согласованность данных. Это API-вызовы и требуется время для завершения, а также для асинхронности. Хорошо, что вам не нужно держать какую-либо другую вещь, а не буферный объект.
- Для карты + чтение/запись. При создании зоны памяти вам необходимо сделать карту и сохранить значение указателя. Затем при уничтожении буфера вам нужно сначала размонтировать, а затем уничтожить его. Вы должны держать
buffer+Mapped_Buffer
все время. Хорошо, что теперь вы можете простоclEnqueueRead/Write
сопоставить указатель. API будет ждать согласованных данных, а затем подумать об этом. Это проще в использовании, поскольку это похоже на создание карты + unmap за один кадр.
Режим чтения/записи проще в использовании, особенно для повторяющихся чтений, но не настолько универсален, как опция ручной карты, так как вы НЕ МОЖЕТЕ писать карту read only
или не читать карту write only
. Но для общего использования переменные, которые читаются, никогда не будут записаны, а наоборот.
Я понимаю, что рекомендация Intel относится к "Использовать карту, а не просто читать/писать" , а не ". Когда вы используете Map, не используйте Read/Write over Mapped указатели" .
Вы проверили эту рекомендацию nVIDIA по Intel HW? Я думаю, что это должно сработать, однако я не знаю, действительно ли операция была бы оптимальной (как в AMD или nVIDIA HW).