Які особливості роблять OpenCL унікальним для вибору серед OpenGL із GLSL для розрахунків? Незважаючи на графічну термінологію та непрактичні типи даних, чи існує реальне застереження до OpenGL?
Так: це графічний API. Тому все, що ви робите в ньому, має бути сформульовано відповідно до цих термінів. Ви повинні упакувати свої дані як певну форму "візуалізації". Ви повинні зрозуміти, як поводитися з вашими даними з точки зору атрибутів, єдиних буферів та текстур.
З обчислювальними шейдерами OpenGL 4.3 та OpenGL ES 3.1 все стає дещо заплутанішим. Шейдер обчислень може отримувати доступ до пам'яті через SSBOs / Image Load / Store аналогічно обчислювальним операціям OpenCL (хоча OpenCL пропонує фактичні вказівники, тоді як GLSL цього не робить). Їх взаємодія з OpenGL також набагато швидша, ніж взаємодія OpenCL / GL.
Незважаючи на це, обчислювальні шейдери не змінюють одного факту: обчислювальні операції OpenCL працюють з абсолютно різною точністю, ніж обчислювальні шейдери OpenGL. Вимоги до точності з плаваючою комою GLSL не дуже жорсткі, а OpenGL ES ще менш жорсткі. Отже, якщо точність з плаваючою точкою є важливою для ваших розрахунків, OpenGL не буде найефективнішим способом обчислення того, що вам потрібно обчислити.
Крім того, для обчислювальних шейдерів OpenGL потрібно апаратне забезпечення, що підтримує 4.x, тоді як OpenCL може працювати на значно гіршому апаратному забезпеченні.
Крім того, якщо ви обчислюєте, вибравши конвеєр візуалізації, драйвери OpenGL все одно вважатимуть, що ви робите рендеринг. Тож він буде приймати рішення щодо оптимізації, виходячи з цього припущення. Це дозволить оптимізувати призначення ресурсів шейдерів, якщо припустити, що ви малюєте картину.
Наприклад, якщо ви здійснюєте візуалізацію до буфера з плаваючою крапкою, драйвер може просто вирішити надати вам буфер кадрів R11_G11_B10, оскільки він виявляє, що ви нічого не робите з альфою, і ваш алгоритм може переносити нижчу точність. Якщо ви використовуєте завантаження / зберігання зображень замість буфера кадрів, ви набагато рідше отримаєте цей ефект.
OpenCL не є графічним API; це обчислювальний API.
Крім того, OpenCL просто надає вам доступ до більшої кількості матеріалів. Це дає вам доступ до рівнів пам'яті, які неявно стосуються GL. Певна пам'ять може бути спільно використана між потоками, але окремі екземпляри шейдерів у GL не можуть впливати безпосередньо один на одного (поза Image Load / Store, але OpenCL працює на обладнанні, яке не має до нього доступу).
OpenGL приховує те, що робить обладнання, за абстракцією. OpenCL піддає вас майже точно тому, що відбувається.
Ви можете використовувати OpenGL для довільних обчислень. Але ти не хочеш ; не поки є цілком життєздатна альтернатива. Обчислення в OpenGL діє для обслуговування графічного конвеєру.
Тільки причина , щоб вибрати OpenGL для будь-якого виду НЕ-рендеринга операції обчислювальному є підтримка апаратних засобів , які не можуть працювати OpenCL. В даний час сюди входить багато мобільного обладнання.
varying
для вас дані вершин, які були оголошені ключовим словом. Як би ви досягли відповідної речі в OpenCL?