2016-06-13 3 views
-1

Если я следующее:OpenCL: Объект не получает инициализируется со значением

this->bufferParams = cl::Buffer(context, CL_MEM_READ_ONLY, sizeof(Params), &params, NULL); 

Мой буфер не кажется, чтобы заселена с моим объектом Params. Однако, если я это сделаю

this->queue.enqueueWriteBuffer(this->bufferParams, CL_TRUE, 0, sizeof(Params), &params, NULL); 

Тогда это сработает. Есть ли способ в п :: синтаксис буфера для инициализации объекта в Титулы напрямую, а не делать команду Епдиеие

ответ

4

Просто сделай это:

this->bufferParams = cl::Buffer(context, CL_MEM_READ_ONLY| 
CL_MEM_COPY_HOST_PTR, sizeof(Params), &params, NULL); 

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

EXTRA: Кроме того, для объектов с очень малой структурой, например, ваши Params, вероятно, используют его непосредственно на clSetKernelArgs(). Нет необходимости создавать буфер, если вы просто устанавливаете некоторые постоянные значения, которые никогда не записываются. Он также проходит через более оптимизированный путь памяти.

+0

Хорошо, но изнутри ядро ​​должен быть быстрый доступ? Я сделаю это только один раз – raaj

+0

Если вы создаете буфер, он ведет себя как буфер, поэтому он является указателем в ядре и поэтому может быть записан. Так что он никоим образом не оптимизирован. Однако, если вы объявите его __constant, компилятор будет оптимизировать его, используя постоянную память. Но самый простой способ - просто использовать 'clSetKernelArgs()' напрямую. Это уже дает компилятору намек на то, что он никогда не будет написан, и позволяет вам обрабатывать создание буфера. – DarkZeros

+0

Я бы рекомендовал использовать CL_MEM_USE_HOST_PTR для повышения производительности (нулевая копия, если поддерживается устройством). Существуют некоторые требования к Intel Gfx (буфер должен быть выровнен по 4K, а длина должна быть равна 64) – Elalfer

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