Тест CL_MEM_USE_HOST_PTR и CL_MEM_COPY_HOST_PTR в OpenCL - PullRequest
3 голосов
/ 05 марта 2012

У меня есть вектор на хосте, и я хочу уменьшить его вдвое и отправить на устройство.Выполнение теста показывает, что CL_MEM_ALLOC_HOST_PTR быстрее, чем CL_MEM_USE_HOST_PTR, и намного быстрее, чем CL_MEM_COPY_HOST_PTR.Также анализ памяти на устройстве не показывает никакой разницы в размере буфера, созданного на устройстве.Это отличается от документации упомянутого флага на Khronos-clCreateBuffer .Кто-нибудь знает, что происходит?

Ответы [ 3 ]

8 голосов
/ 18 октября 2012

Ответ Помпея 2 неверен.Спецификация не дает никаких гарантий относительно того, где распределена память, а только как она распределена.CL_MEM_ALLOC_HOST_PTR заставляет clCreateBuffer выделять память на стороне хоста для вас.Затем вы можете сопоставить это с указателем хоста, используя clEnqueueMapBuffer.CL_MEM_USE_HOST_PTR заставит среду выполнения выкапывать данные, которые вы ей даете, в буфер OpenCL.

Зафиксированная память достигается за счет использования CL_MEM_ALLOC_HOST_PTR: среда выполнения может выделять память так, как она может.

Вся эта производительность зависит от реализации.Более подробное чтение раздела 3.1.1 покажет, что в одном из вызовов (без флага CL_MEM) NVIDIA может предварительно выделить буфер на стороне устройства, в то время как другие вызовы просто передают закрепленные данные в указатель хоста, готовый для записи на устройство..

2 голосов
/ 06 марта 2012

Прежде всего, и, если я правильно вас понимаю, clCreateSubBuffer, вероятно, не то, что вам нужно, поскольку он создает суббуфер из существующего объекта буфера OpenCL . Документация, на которую вы ссылаетесь, также говорит нам, что:

Значения CL_MEM_USE_HOST_PTR, CL_MEM_ALLOC_HOST_PTR и CL_MEM_COPY_HOST_PTR нельзя указывать в флагах, но они наследуются от соответствующих квалификаторов доступа к памяти, связанных с буфером.

Вы сказали, что у вас есть вектор на хосте и вы хотите отправить половину его на устройство. Для этого на устройстве я бы использовал обычный буфер размером в половину вектора (в байтах).

Затем при обычном буфере ожидаемая производительность ожидается.

  1. CL_MEM_ALLOC_HOST_PTR только выделяет память на хосте, что вообще не вызывает никакой передачи: это похоже на выполнение malloc и не заполнение памяти.
  2. CL_MEM_COPY_HOST_PTR выделит буфер на устройстве, наиболее вероятно, ОЗУ на графических процессорах, а затем скопирует весь ваш хост-буфер в память устройства.
  3. На графических процессорах CL_MEM_USE_HOST_PTR, скорее всего, выделяет так называемую блокировку страницы или закрепленную память. Этот тип памяти является самым быстрым для передачи памяти хост-графическим процессором, и это рекомендуемый способ сделать копию.

Чтобы узнать, как правильно использовать закрепленную память на устройствах NVidia, см. Главу 3.1.1 Руководство по оптимальным методам NVIDIA OpenCL . Обратите внимание, что если вы используете слишком много закрепленной памяти, производительность может упасть ниже скопированной памяти хоста.

Причина , почему закрепленная память быстрее, чем скопированная память устройства, хорошо объяснена в этом SO вопросе , а также этой ветке форума , на которую она указывает.

1 голос
/ 21 марта 2012

Pompei2, вы говорите, что CL_MEM_ALLOC_HOST_PTR и CL_MEM_USE_HOST_PTR распределяют память на устройстве, в то время как спецификация OpenCL 1.1 говорит, что с CL_MEM_ALLOC_HOST_PTR или CL_MEM_USE_HOST_PTR указанная память будет выделена (в первом случае) на или будет использоваться памятью из (в первом случае)?Я новичок в OpenCL, но хотите знать, где это правда?)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...