Прежде всего, и, если я правильно вас понимаю, clCreateSubBuffer, вероятно, не то, что вам нужно, поскольку он создает суббуфер из существующего объекта буфера OpenCL . Документация, на которую вы ссылаетесь, также говорит нам, что:
Значения CL_MEM_USE_HOST_PTR, CL_MEM_ALLOC_HOST_PTR и CL_MEM_COPY_HOST_PTR нельзя указывать в флагах, но они наследуются от соответствующих квалификаторов доступа к памяти, связанных с буфером.
Вы сказали, что у вас есть вектор на хосте и вы хотите отправить половину его на устройство. Для этого на устройстве я бы использовал обычный буфер размером в половину вектора (в байтах).
Затем при обычном буфере ожидаемая производительность ожидается.
CL_MEM_ALLOC_HOST_PTR
только выделяет память на хосте, что вообще не вызывает никакой передачи: это похоже на выполнение malloc и не заполнение памяти.
CL_MEM_COPY_HOST_PTR
выделит буфер на устройстве, наиболее вероятно, ОЗУ на графических процессорах, а затем скопирует весь ваш хост-буфер в память устройства.
- На графических процессорах
CL_MEM_USE_HOST_PTR
, скорее всего, выделяет так называемую блокировку страницы или закрепленную память. Этот тип памяти является самым быстрым для передачи памяти хост-графическим процессором, и это рекомендуемый способ сделать копию.
Чтобы узнать, как правильно использовать закрепленную память на устройствах NVidia, см. Главу 3.1.1 Руководство по оптимальным методам NVIDIA OpenCL . Обратите внимание, что если вы используете слишком много закрепленной памяти, производительность может упасть ниже скопированной памяти хоста.
Причина , почему закрепленная память быстрее, чем скопированная память устройства, хорошо объяснена в этом SO вопросе , а также этой ветке форума , на которую она указывает.