OpenGL против OpenCL, что выбрать и почему? - PullRequest
69 голосов
/ 26 октября 2011

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

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

Ответы [ 10 ]

56 голосов
/ 26 октября 2011

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

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

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

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

41 голосов
/ 01 июля 2014

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

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

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

22 голосов
/ 27 октября 2011

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

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

С OpenGL 4.3 и OpenGL ES 3.1 вычисляют шейдеры , все становится немного более запутанным,Вычислительный шейдер может получить доступ к памяти через SSBO / 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 живут для обслуживания графического конвейера.

only причина выбора OpenGL для любого вида вычислительных операций без рендеринга состоит в поддержке аппаратного обеспечения, которое не может запустить OpenCL.В настоящее время это включает в себя много мобильного оборудования.

12 голосов
/ 26 октября 2011

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

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

9 голосов
/ 21 ноября 2012

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

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

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

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

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

6 голосов
/ 27 октября 2011

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

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

4 голосов
/ 27 ноября 2014

Как и в 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 получил возможность сортировать вещи по различным областям памяти клиента и сервера, так как было сделано много других постов. OpenGL теперь имеет лучшую защиту памяти и атомарную поддержку и позволяет вам распределять объекты по разным регистрам в GPU (примерно в той же степени, что и OpenCL). Например, вы можете совместно использовать регистры в локальной вычислительной группе теперь в OpenGL (используя что-то вроде AMD LU GPU (локальный общий доступ к данным) (хотя эта конкретная функция в настоящее время работает только с вычислительными шейдерами OpenGL). OpenGL имеет более эффективные реализации на некоторых платформах (например, драйверы Open Source Linux). OpenGL имеет доступ к более фиксированному оборудованию (как уже говорилось в других ответах). Хотя это правда, что иногда можно избежать аппаратного обеспечения с фиксированными функциями (например, Crytek использует «программную» реализацию буфера глубины), аппаратное обеспечение с фиксированными функциями может очень хорошо управлять памятью (и обычно намного лучше, чем тот, кто не работает на GPU) аппаратная компания могла бы) и просто значительно превосходит в большинстве случаев. Я должен признать, что OpenCL имеет довольно хорошую поддержку текстур с фиксированными функциями, которая является одной из основных областей с фиксированными функциями OpenGL.

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

3 голосов
/ 28 июня 2014

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

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

2 голосов
/ 15 января 2014

«Особенность» OpenCLL предназначена для вычислений общего назначения, а OpenGL - для графики. Вы можете делать все что угодно в GL (это полная Тьюринга), но затем вы вбиваете гвоздь, используя ручку отвертки в качестве молотка.

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

2 голосов
/ 26 октября 2011

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

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

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

...