Я пытаюсь сделать взаимодействие 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 длявзаимодействовать, но, как я уже сказал, я хочу, чтобы все было как можно проще, плюс мне просто интересно, почему это так.Есть идеи?