OpenCL OpenGL аргумент ядра взаимодействия для чтения + записи - PullRequest
0 голосов
/ 18 февраля 2019

Я пытаюсь сделать взаимодействие OpenCL / OpenGL, используя текстуру OpenGL, как описано в в этом руководстве Intel .Я хочу, чтобы мой хост-код был как можно более простым, поэтому я хотел использовать «Метод 1», создавая таким образом изображение OpenCL из текстуры OpenGL с clCreateFromGLTexture.В руководстве также говорится следующее:

Обратите внимание на флаг CL_MEM_WRITE_ONLY, который позволяет быстро отбрасывать данные.Используйте CL_MEM_READ_WRITE, если ваше ядро ​​требует чтения текущего контекста текстуры.Также в этом случае удалите спецификатор _write_only для доступа к изображениям в ядре.

Однако, похоже, это не работает.Как только я удаляю __write_only из ядра, я получаю ошибку компиляции, используя платформу Nvidia OpenCL 1.2 CUDA 10.0.132 (драйвер 417.71):

Ошибка: неверный тип изображения в sust.

Что бы это ни значило.Используя платформу Intel OpenCL 2.1 UHD Graphics 620 (драйвер 24.20.100.6286), я получаю следующее:

CTHeader.h: 1333: 38: примечание: функция-кандидат недопустима: нет известного преобразования из ' read_only image2d_t 'в' __write_only image1d_array_t 'для 1-го аргумента void __attribute ((с перегрузкой)) write_imagef (write_only image1d_array_t image_array, координата int2, цвет float4);

*, например, из 1024 * *1023* *__read_only?

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

вызовы read_image и write_image к одному и тому же объекту памяти изображений в ядре не поддерживаются

Так что мне интересно, так как учебник не углубляется в детали настройки аргумента ядра, может бытьиспользование image2d_t неправильно во-первых.Поскольку аргумент имеет тип cu_mem на стороне хоста, я пробовал с float*, но пока безуспешно.

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

1 Ответ

0 голосов
/ 18 февраля 2019

Параметр образа ядра должен быть квалифицирован как __write_only или __read_only, вплоть до OpenCL 2.0, что позволяет изображениям быть __read_write, но должны соблюдаться специальные правила (такие как барьеры) дляполучить правильные результаты.Обратите внимание, что изображение также имеет спецификатор, который указывает, как хост может получить к нему доступ (только чтение, только запись или чтение / запись).Данный образ может быть __write_only в одном ядре, а затем __read_only в следующем, что позволяет передавать результаты одного ядра в следующее.

...