Журнал LinuxFormat - перейти на главную

LXF160:Что за штука OpenCL

Материал из Linuxformat
Перейти к: навигация, поиск


Что за штука… 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 %20Tuto­rials %20- %201. |

Персональные инструменты
купить
подписаться
Яндекс.Метрика