OpenGL против OpenCL, который выбрать и почему?

Какие функции делают OpenCL уникальным для выбора OpenGL с помощью GLSL для расчетов? Несмотря на графическую связанную терминологию и практические типы данных, существует ли какое-либо реальное препятствие для OpenGL?

Например, оценка параллельной функции может быть выполнена путем рендеринга a текстуре с использованием других текстур. Сокращение операций может быть выполнено путем итеративного рендеринга на меньшие и меньшие текстуры. С другой стороны, случайный доступ к записи невозможен ни в какой эффективной форме (единственный способ сделать - это преобразовать треугольники с помощью данных вершинных данных с текстурой). Возможно ли это с помощью OpenCL? Что еще возможно с OpenGL?

Ответ 1

OpenCL создан специально для вычислений. Когда вы занимаетесь научными вычислениями с использованием OpenGL, вам всегда нужно думать о том, как сопоставить вашу вычислительную проблему с графическим контекстом (т.е. Говорить в терминах текстур и геометрических примитивов, таких как треугольники и т.д.), Чтобы получить ваши вычисления.

В OpenCL вы просто формулируете вычисления с ядром вычисления в буфере памяти, и вам хорошо идти. Это на самом деле БОЛЬШАЯ победа (говоря, что с точки зрения продумать и реализовать оба варианта).

Шаблоны доступа к памяти все те же (ваши вычисления все еще происходят на графическом процессоре, но в наши дни графические процессоры становятся все более гибкими). ​​

Но что еще вы ожидаете, чем использовать более десятка параллельных "ЦП", не разбирая головы о том, как переводить - например, (глупый пример) Фурье к треугольникам и квадрантам...?

Ответ 2

То, что пока не упоминалось ни в каких ответах, - это скорость исполнения. Если ваш алгоритм может быть выражен в графике OpenGL (например, без разбросанных записей, без локальной памяти, без рабочих групп и т.д.), Это будет очень часто работать быстрее, чем OpenCL. Мой специфический опыт в этом заключается в создании фильтров для фильтрации изображений (сбора) на графических процессорах AMD, nVidia, IMG и Qualcomm. Реализации OpenGL неизменно работают быстрее даже после жесткой оптимизации ядра OpenCL. (в стороне: я подозреваю, что это связано с тем, что многие годы аппаратные средства и драйверы были специально настроены на ориентированные на графику рабочие нагрузки.)

Мой совет будет заключаться в том, что если ваша вычислительная программа чувствует, что она хорошо отображает графический домен, то используйте OpenGL. Если нет, OpenCL более общий и более простой, чтобы выразить вычислительные проблемы.

Еще один момент, который следует упомянуть (или спросить), заключается в том, пишете ли вы как любителя (т.е. для себя) или коммерчески (то есть для распространения другим). Хотя OpenGL поддерживается практически везде, OpenCL полностью не поддерживает поддержку мобильных устройств, и imho вряд ли появится на Android или iOS в ближайшие несколько лет. Если широкая совместимость с кросс-платформой с одной базой кода является целью, то OpenGL может быть навязана вам.

Ответ 3

Какие функции делают OpenCL уникальным для выбора OpenGL с помощью GLSL для расчетов? Несмотря на графическую связанную терминологию и практические типы данных, существует ли какое-либо реальное препятствие для OpenGL?

Да: это графический API. Поэтому все, что вы делаете в этом, должно быть сформулировано на этих условиях. Вы должны упаковать свои данные в виде "рендеринга". Вы должны выяснить, как обращаться с вашими данными с точки зрения атрибутов, равномерных буферов и текстур.

С OpenGL 4.3 и OpenGL ES 3.1 вычислить шейдеры, все становится немного более запутанным. Вычислительный шейдер способен получать доступ к памяти через SSBOs/Image Load/Store аналогичным образом для операций OpenCL (хотя OpenCL предлагает фактические указатели, а GLSL - нет). Их взаимодействие с OpenGL также намного быстрее, чем OpenCL/GL interop.

Тем не менее, вычислительные шейдеры не меняют одного факта: операции вычисления 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. В настоящее время это включает в себя множество мобильных устройств.

Ответ 4

Одна заметная особенность - это разбросанные записи, другой - отсутствие "умности Windows 7". Windows 7, как вы, вероятно, знаете, убьет драйвер дисплея, если OpenGL не закрашивается в течение 2 секунд или около того (не прибивайте меня в точное время, но я думаю, что это 2 секунды). Это может раздражать, если у вас длительная операция.

Кроме того, OpenCL, очевидно, работает с гораздо большим разнообразием аппаратных средств, чем просто графическая карта, и у нее нет жесткого графического ориентированного конвейера с "искусственными ограничениями". Легче (тривиально) запускать несколько параллельных потоков команд.

Ответ 5

Хотя в настоящее время OpenGL будет лучшим выбором для графики, это не является постоянным.

Вполне возможно, что OpenGL будет в конечном итоге сливаться как расширение OpenCL. Две платформы примерно на 80% одинаковы, но имеют разные синтаксические причуды, различную номенклатуру для примерно одинаковых компонентов аппаратного обеспечения. Это означает два языка для изучения, два API для определения. Разработчики графических драйверов предпочли бы слияние, потому что им больше не придется разрабатывать для двух отдельных платформ. Это оставляет больше времени и ресурсов для отладки драйвера.;)

Еще одна вещь, которую следует учитывать, заключается в том, что истоки OpenGL и OpenCL различны: OpenGL начал и набирал обороты во время ранних дней с фиксированным конвейером по сети, и был медленно добавлен и устарел по мере развития технологии. OpenCL, в некотором роде, является эволюцией OpenGL в том смысле, что OpenGL начал использоваться для цифровой обработки, так как допустима (незапланированная) гибкость графических процессоров. "Graphics vs. Computing" - это скорее семантический аргумент. В обоих случаях вы всегда пытаетесь сопоставить свои математические операции с оборудованием с максимальной производительностью. Есть части оборудования графического процессора, которые не будут использовать vanilla CL, но это не будет поддерживать отдельное расширение.

Итак, как OpenGL может работать под CL? В частности, растеризаторы треугольников могут быть выделены в виде специальной задачи CL. Специальные функции GLSL могут быть реализованы в vanilla OpenCL, а затем переопределены для аппаратных ускоренных инструкций драйвером во время компиляции ядра. Написание шейдера в OpenCL, в ожидании расширения библиотеки, не звучит как болезненный опыт.

Чтобы вызвать одно, чтобы иметь больше функций, чем другие, не имеет большого смысла, поскольку они оба набирают 80% одинаковых функций, только под разными номенклатурами. Утверждать, что OpenCL не подходит для графики, потому что он предназначен для вычислений, не имеет смысла, поскольку графическая обработка вычисляется.

Ответ 6

Еще одна важная причина в том, что OpenGL\GLSL поддерживается только на видеокартах. Хотя многоядерное использование началось с использования графического оборудования, многие производители аппаратных средств работают на многоядерной аппаратной платформе, предназначенной для вычислений. Например, см. Intels Knights Corner.

Разработка кода для вычислений с использованием OpenGL\GLSL не позволит вам использовать какое-либо оборудование, которое не является графической картой.

Ответ 7

OpenCL (в версии 2.0) описывает гетерогенную вычислительную среду, в которой каждый компонент системы может производить и потреблять задачи, созданные другими системными компонентами. Больше нет требований к процессору, GPU (и т.д.) - у вас есть только Host и Device (s).

OpenGL, напротив, имеет строгое разделение на CPU, который является производителем задач и графическим процессором, который является потребителем задач. Это неплохо, так как меньшая гибкость обеспечивает большую производительность. OpenGL - это еще более узкий инструмент.

Ответ 8

Хорошо, как и OpenGL 4.5, это особенности OpenCL 2.0, что OpenGL 4.5 не (насколько я мог сказать) (это не касается функций, которые OpenGL имеет, что OpenCL не делает):

События

Лучшая атомная техника

Блоки

Функции рабочей группы:               work_group_all и work_group_any               work_group_broadcast:               work_group_reduce               work_group_inclusive/exclusive_scan

Ядро запуска из ядра

Указатели (хотя, если вы выполняете на GPU, это, вероятно, не имеет значения)

Несколько математических функций, которые OpenGL не имеет (хотя вы могли бы создать их самостоятельно в OpenGL)

Общая виртуальная память

(Дополнительно) Параметры компилятора для ядер

Легко выбрать конкретный графический процессор (или иначе)

Может работать на ЦПУ, если нет графического процессора

Больше поддержки для тех нишевых аппаратных платформ (например, FGPA)

На некоторых (всех?) платформах вам не нужно окно (и его привязка к контексту) для выполнения вычислений.

OpenCL позволяет немного больше контролировать точность вычислений (в том числе и некоторые из этих параметров компилятора).

Многие из них в основном связаны с улучшенным взаимодействием с процессором и графическим процессором: событиями, общей виртуальной памятью, указателями (хотя они потенциально могут принести пользу и другим вещам).

OpenGL получил возможность сортировать вещи в разных областях памяти Client and Server, так как многие другие сообщения здесь были сделаны. Теперь OpenGL имеет лучшую защиту памяти и атомную поддержку и позволяет распределять вещи в разные регистры в графическом процессоре (примерно в той же степени, что и OpenCL). Например, вы можете совместно использовать регистры в локальной вычислительной группе теперь в OpenGL (используя что-то вроде LDS (локальный общий ресурс) графических процессоров AMD (хотя эта особенность работает только с шейдерными вычислениями OpenGL в это время). OpenGL имеет более эффективные реализации на некоторых платформах (таких как драйверы с открытым исходным кодом Linux). OpenGL имеет доступ к более аппаратным средствам с фиксированной функциональностью (как говорили другие ответы). Хотя верно, что иногда может быть устранено аппаратное обеспечение с фиксированной функциональностью (например, Crytek использует "программную" реализацию буфера глубины) аппаратное обеспечение с фиксированной функцией может прекрасно управлять памятью (и обычно намного лучше, чем тот, кто не работает на GPU аппаратная компания могла бы) и в большинстве случаев значительно превосходит их. Я должен признать, что OpenCL имеет довольно хорошую фиксированную функциональную поддержку текстур, которая является одной из основных областей фиксированной функции OpenGL.

Я бы сказал, что OpenGL стал, по крайней мере, немного менее абстрактным в последнее время, и есть разговоры о полной реорганизации OpenGL (названной медиа OpenGL NG), которая удаляет много абстракции и больше (например, больше функций типа Мантии), Возможно, вы слышали об этом.

Я бы сказал, что Intels Knights Corner - это графический процессор x86, который сам управляет. Я также хотел бы утверждать, что OpenCL 2.0 с его функциями текстуры (которые на самом деле находятся в меньших версиях OpenCL) может использоваться для того же уровня производительности, который предложил пользователь2746401.

Ответ 9

В дополнение к уже существующим ответам OpenCL/CUDA не только больше подходит для вычислительной области, но и не слишком абстрагирует основное оборудование. Таким образом, вы можете получить прибыль от таких вещей, как совместная память или доступ к совместному доступу к памяти, что в противном случае было бы затруднено в реальной реализации шейдера (что само по себе является не чем иным, как специальным ядром OpenCL/CUDA, если вы хотите).

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

Как только вы сделаете что-то более сложное, чем простые процедуры BLAS 1 уровня, вы, несомненно, оцените гибкость и универсальность OpenCL/CUDA.

Ответ 10

"Функция", которую OpenCL предназначена для вычислений общего назначения, в то время как OpenGL предназначен для графики. Вы можете сделать что-нибудь в GL (это Turing-complete), но затем вы едете в гвоздь с помощью рукоятки отвертки в качестве молотка.

Кроме того, OpenCL может работать не только на графических процессорах, но и на процессорах и различных специализированных ускорителях.