LXF160:Что за штука OpenCL
|
|
|
Что за штука… OpenCL
Марко Фиоретти представляет открытый стандарт для процессоров по обработке графики, с которым многие приложения существенно ускорятся.'Курсивное начертание
В
Начнем с основного вопроса: так что же такое OpenCL?
О
Дословно: Open Computing Language (www.khronos.org/opencl) – открытый стандарт для параллельного программирования на GPU.
В
А нельзя ли для начала попроще? Что такое параллельное программирование?
О
На самом деле, это проще, чем кажется (если, конечно, не вам этим заниматься). Параллельное программирование – такой способ написания программ, при котором много схожих операций выполняются параллельно (если это поддерживается оборудованием) – то есть одновременно, а не последовательно, когда одна операция должна закончиться, чтобы началась другая.
В
То есть параллельное программирование заставляет ПО работать быстрее. И насколько?
О
Многие сложные программы будут работать быстрее. Насколько? Однозначно не скажешь. Части обычной программы, использующей для обработки данных вложенные циклы, могут ускориться вдвое. Программы, состоящие преимущественно из математических вычислений – значительно быстрее.
В
Так, с первой частью более-менее понятно, теперь про GPU, пожалуйста.
ОО
GPU [Graphic Processor Units] – это специализированные чипы, выполняющие всю тяжелую работу по обработке графики, от цифрового ТВ до 3D-анимации и супер-реалистичных видеоигр. Обычные процессоры, на которых выполняются операционные системы, не оптимизированы для подобных существенно параллельных задач. А GPU, наоборот, предназначены именно для этого.
В каком-то смысле, OpenCL – это открытый аналог Compute Unified Device Architecture (Cuda) от Nvidia, которая тоже ориентирована на более эффективное исполнение кода с использованием графических процессоров. Удивительно умная штуковина.
В
Так или иначе, OpenCL был создан для ускорения обработки 3D-графики на настольных компьютерах, так?
О
Вовсе нет! Дело в красоте OpenCL и его значимости (наряду с открытостью, конечно). Судя по последним тенденциям, наличие такого стандарта просто необходимо.
В
О каких, собственно, тенденциях идет речь?
О
Их несколько. Первая – рост производительности GPU для обычных настольных компьютеров. Они стали настолько мощными, что использовать их только для 3D-игр и видео просто стыдно.
В
Да, в этом смысле у параллельного программирования действительно неплохие перспективы. А что еще?
О
Повсеместность GPU. Сегодня специальные чипы для параллельного программирования вшиты в каждый смартфон или планшет.
Но, как правило, они не задействованы для работы с текстами, электронными таблицами или сетевым обозревателем. Упростив для сложного интерактивного ПО доступ к этой вычислительной мощности в реальном времени, мы по производительности приблизим мобильные устройства к полноценным настольным системам.
В
И много ли нынче ПО, работающего таким образом?
О
Пока что ускорение GPU используется лишь в некоторых программах. Даже Photoshop, Camtasia и Matlab только начинают внедрять эти функции.
В
Но если параллельное программирование так замечательно, почему же его так мало где используют?
О
Отчасти потому, что сама идея применения ускорения GPU для не-графического ПО вышла из научной компьютерной среды сравнительно недавно. Другая причина в том, что процессоры GPU на портативных устройствах тоже не так давно стали настолько мощными и распространенными, чтобы оправдать введение специального стандарта. То же касается облачных вычислений.
В
Облачных вычислений? А вы что имеете в виду?
О
Облачные вычисления – это средства удаленного доступа к вашим файлам и программам, с любого компьютера, планшета или смартфона. Вы же слышали об этом, правда?
В
Еще бы. И уже пользуюсь этим с Gmail, Google Docs и Dropbox. И что?
О
Параллельное программирование на основе GPU добавляет ко всему этому аппаратное ускорение. Благодаря виртуализации, удаленный сервер, оборудованный самыми современными GPU, способен, например, обрабатывать видеопотоки параллельно для нескольких пользователей.
В
Здорово! Теперь вы меня убедили, что открытый стандарт для кросс-платформенного параллельного программирования на основе GPU необходим. Насколько с этим справляется OpenCL?
О
OpenCL должен существенно упростить написание эффективного, портируемого кода, работающего на многих комбинациях многоядерных CPU, GPU и других параллельных процессоров.
В
А почему вы употребили выражение «на комбинациях»?
О
Потому что именно это от OpenCL и требуется. Обычные программы не могут выполнять много параллельных задач просто потому, что работают на традиционных (то есть последовательных) CPU. А задача OpenCL в том, чтобы максимально перенести эту нагрузку на GPU, чтобы все выполнялось параллельно.
В
Если я правильно понимаю, это значит, что программы, использующие OpenCL, тоже обязаны иметь смешанную структуру. Так?
О
Именно! OpenCL вызывает центральный процессор, где запускается ядро обычного приложения. GPU называются вычислительными устройствами. Каждое такое устройство включает одну или более вычислительных единиц, которые, в свою очередь, содержат один или более элементов обработки.
В
Какая роль в этой ситуации отведена хосту?
О
Исполняемый им код контролирует взаимодействие с пользователем, управление памятью и все задачи OpenCL, включая передачу данных на GPU и его запуск. Когда все устройства заканчивают работу, хост получает данные-результаты и переходит к следующему шагу. OpenCL предоставляет стандартные API для распознавания устройств и обработки данных и команд.
В
А какова роль программиста в данном процессе?
О
Разработчики должны явно указать в коде, какая его часть исполняется на главном процессоре, а какая – на устройствах, пользуясь спецификацией OpenGL.
В
То есть параллельный код исполняется только на устройствах?
О
Да, это так. Иногда говорят, что волшебство OpenCL вершится на устройствах. Именно там исполняется код на языке OpenCL – это своего рода специальная версия С.
В
Но ведь API — общий программный интерфейс. Как же хост сообщает устройствам, что именно им делать?
О
Для этого есть особые функции, называемые ядрами вычислений. Это своего рода точки входа для устройств OpenCL, которые их активируют и сообщают им задания.
В
А что начинает происходить потом?
О
Выделенный ядром фрагмент кода, который на языке OpenCL называется рабочим элементом, исполняется параллельно много раз, с новыми данными. Такие элементы обычно организуются в группы и диапазоны, определяющие порядок запуска.
В
Что требуется для совместимости с OpenCL?
О
В основной спецификации перечислены все требования, которым должна соответствовать полноценная программная/аппаратная среда для совместимости с OpenCL. В официальном профиле конфигурации для портативных и встроенных устройств указаны необходимые условия для этих двух случаев. Ну и, конечно, стандарт также определяет язык, упомянутый нами как «специальная версия С». Наконец, есть расширения, то есть необязательные функции. Они включены в стандарт потому, что кажутся достаточно интересными, чтобы в будущем также войти в основную спецификацию OpenCL.
В
Каков в настоящий момент статус OpenCL?
О
OpenCL 1.2, имеющий обратную совместимость с версиями 1.0 и 1.1, но поддерживающий большее число устройств и ядер, вышел в ноябре 2011. В него были добавлены средства заимодействовия с OpenGL и OpenGL ES, улучшены характеристики производительности и поддержка DirectX 9 и 11.
В
А есть ли хотя бы один пример реализации OpenCL в свободном ПО?
О
Есть. Присмотритесь к Portable OpenCL (http://pocl.sourceforge.net) – это проект, целью которого является «улучшить переносимость программ на OpenCL», что значит обеспечить более-менее стабильную производительность для любых хостов и устройств, минимизируя необходимость ручной оптимизации. Дополнительную информацию вы можете получить на http://opencl.codeplex.com/wikipage?title=OpenCL %20Tutorials %20- %201. |