20 августа 2009
Обновлено 17.05.2023

Нецентральный процессор. Расчеты общего назначения силами графического процессора

Нецентральный процессор. Расчеты общего назначения силами графического процессора - изображение обложка

Сегодня, пожалуй, только ленивый не слышал о графических процессорах, занимающихся расчетами общего назначения. Прогремела по всему миру NVIDIA CUDA , собрал аудиторию AMD FireStream , нагнали туману OpenCL и DirectX 11 , внес свою судебную лепту Intel. В общем, никто не остался в стороне — так или иначе, к технологии приложили руку все, даже Apple со своей поддержкой GPU-расчетов общего назначения на уровне операционной системы. Самое время разобраться, что вообще такое расчеты общего назначения, почему видеокарты нужны не только для игр и что хорошего несет нам эра многофункциональных графических процессоров.

Шведы, белки и параллельные вычисления

Все началось в 2003 году. Группа студентов из Готландского университета (г. Висби, Швеция) столкнулась с неприятной проблемой: им нужно было произвести довольно масштабные параллельные матричные вычисления. Настолько масштабные, что центральные процессоры компьютеров, к которым студенты имели доступ, занимались бы этими вычислениями около шести месяцев. А на носу у студентов была сдача дипломной работы.

Сначала шведы решили прибегнуть к помощи мировой общественности (программы добровольного участия в распределенных вычислениях как раз набирали популярность), но закопались в необходимых для регистрации проекта документах. И тогда одному из них пришла в голову мысль: а почему бы не использовать вместо центрального процессора графический? Вычислительные мощности GPU к 2003 году уже на голову превосходили возможности CPU, ориентированы были как раз на параллельные вычисления и просто идеально подходили для решения задачи. Правда, аппаратных средств для просчета «не графики» на GPU в тот момент еще не было, но это не могло остановить энтузиастов, и уже через несколько недель начались расчеты. Заняли они два с половиной месяца.

Так родилась концепция GPGPU, General-Purpose Graphics Processing Units, расчетов общего назначения, выполняемых графическим процессором. Как и всякий энтузиазм от мира техники, всего за пару лет идея поработила умы множества программистов по всему свету. Создавались сообщества приверженцев новой концепции, устраивались международные форумы и круглые столы. Самым известным, пожалуй, стал проект BionicFX , на основе которого строилась социальная сеть AVEX (Audio Video EXchange). Используя видеокарту GeForce 6800 в качестве процессора, BionicFX быстро и без особенных проблем перегонял аудиофайлы из формата в формат, приводил их к нужному размеру и даже умел обрабатывать данные потоково, по мере загрузки файла на сервер.

Другой нашумевший проект — программа распределенных вычислений Folding@Home Стенфордского университета. Она, кстати, начиналась с использования центральных процессоров, но с появлением GPGPU перешла на процессоры графические. Производительность от этого увеличилась втрое.

Разумеется, все это не могло пройти незамеченным главными китами графического бизнеса — NVIDIA и ATI. Первыми встрепенулись «красные»: в начале 2006 года компания ATI объявила о скором выпуске аппаратной платформы Radeon R580 , способной заменить собой «черновые наброски энтузиастов GPGPU». Правда, вышла платформа еще только через год, причем совсем под другим названием — готовый продукт носил гордое имя AMD FireStream и был рассчитан на работу с видеокартами нового поколения, построенных на 55-нм техпроцессе. NVIDIA со своим анонсом GPGPU несколько припозднилась: впервые о платформе для вычислений общего назначения силами GPU компания заговорила только осенью 2006 года. Зато уже к началу 2007-го первая версия аппаратно-программной системы CUDA (Compute Unified Device Architecture, архитектура вычислений общего назначения) появилась на ее официальном сайте, и всего за полгода набрала такую популярность, которую пара AMD-ATI не может набрать со своим FireStream до сих пор.

Все дело в волшебных пузырьках

Прежде чем разбираться в тонкостях разных вычислительных платформ, давайте поговорим о том, чем же, собственно, графический процессор так превосходит центральный? CPU создавались для работы с потоковыми инструкциями, а GPU — для параллельных вычислений. То есть, если утрировать, центральный процессор предназначен для обработки инструкций, в которых сначала считается А, потом B и, наконец, C (потому что результат C как-то связан с результатами A и B), а графический — для инструкций, в которых все три компонента считаются одновременно и результаты просчетов на данном этапе никак не влияют друг на друга.

Однако сказать, что центральные процессоры не умеют работать с параллельными вычислениями вообще, — значит погрешить против истины. Они умеют. Просто не очень хорошо. Например, процессоры Pentium могут выполнять две инструкции за такт, а Pentium Pro — динамически изменять приоритет инструкций и, соответственно, исполнять их практически параллельно.

С появлением процессорной многоядерности и быстрой памяти ситуация изменилась к лучшему, и сегодня CPU можно доверить даже просчет графики, но… зачем? GPU справляются с такими задачами гораздо лучше — у них и процессорных ядер больше, и память используется разумнее. Если центральный процессор обращается к своему кэшу беспорядочно и записывает данные в произвольное место, то у GPU все строго по-военному: блоки читаются и записываются строго по очереди, один за другим. В результате получается производительность, максимально близкая к теоретической пропускной способности. GPU может обойтись гораздо меньшим, чем у CPU, кэшем и получить при этом более высокие результаты.

Правда, в обратную сторону правило несовместимости тоже действует. Как только GPU сталкивается с необходимостью произвести последовательные вычисления, его производительность резко падает. В теории можно научить графический процессор гибридным вычислениям (то есть и последовательным, и параллельным, причем в любых комбинациях), но пока производители видеокарт этим заниматься не хотят — мол, зачем делать одно устройство для всего на свете, если можно использовать специально разработанные для каждой задачи компоненты? Позиция спорная, но пока лидирующая на рынке. Именно поэтому, вопреки предсказаниям многих IT-аналитиков, в ближайшее время мы не увидим всемогущих графических процессоров, способных заменить процессоры центральные.

NVIDIA: она уже вертится!

Самой крупной и реально поддерживаемой на сегодняшний день платформой, созданной для расчетов общего назначения силами графического процессора, несомненно, является NVIDIA CUDA. Разрабатывается она уже два года, пережила три версии, множество патчей и используется, по данным NVIDIA, более чем на шести миллионах компьютеров ежедневно. Притом, что появилась CUDA не первой и конкуренция у нее не такая уж слабая, результат внушительный.

Секрет успеха прост — равновесие. Закрытая архитектура уравновешивается доступностью и бесплатностью пакета разработчика, жесткая привязка к определенному железу — широким выбором этого самого железа… Систему поддерживает уже несколько десятков различных видеокарт, от слабых мобильных решений и бюджетного ION до мощнейших топовых карточек (полный список можно посмотреть здесь: www.nvidia.ru/object/cuda_learn_products_ru.html ). Причем под любую из них пишется одна и та же программа, исполняемая одним и тем же способом, — и хоть на слабой карте она и станет просчитываться в несколько раз дольше, работать все-таки будет безо всяких портирований.

Еще один плюс CUDA как платформы — доступность для программистов. NVIDIA решила не изобретать велосипед и задействовать языки программирования, которыми люди уже много лет активно пользуются. C# c небольшими расширениями, Fortran, Python, Delphy, OpenGL. Единственное, чему придется поучиться начинающему «кудеру», — это писать программы с параллельными вычислениями. Дело в том, что классическое программирование ориентировано на работу с CPU и там как раз всех со школьной скамьи учат от параллельных вычислений уходить… впрочем, курсы переподготовки есть уже во многих мировых университетах. У нас научиться «кудить» по-настоящему можно на ВМК МГУ, на физтехе СПбГУ, в Екатеринбургском государственном университете и в Казанском государственном университете.

Кроме того, NVIDIA периодически устраивает обучающие курсы в различных российских городах — так что всем заинтересованным советуем следить за объявлениями на стенах родных технических институтов.

Набор разработчика CUDA состоит из трех компонентов: собственно набора средств (подгружаемых библиотек), компилятора (поддерживающего несколько языков программирования) и документации. Все это совершенно бесплатно можно скачать на сайте www.nvidia.ru/object/cuda_get_ru.html или с нашего диска из раздела «Софт».

AMD: мир, дружба, разработка

AMD подошла к проблеме с иной стороны. Вместо того, чтобы делать из видеокарт потенциального (помним про Джека) конкурента своим процессорам, разработчики решили объединить усилия и сделать новую аппаратную платформу из центрального и графического процессоров, которая будет с одинаковой легкостью справляться и с гетерогенными, и с параллельными вычислениями. Целиком она, правда, пока не готова, но фундамент оценить уже можно: по скорости просчета GPGPU-система AMD опережает конкурентов. Правда, тестирования показывают, что качество исполнения пока не столь внушительно.

Принцип работы FireStream немногим отличается от CUDA: графический процессор все так же берет на себя параллельные задачи, собирает свои потоковые процессоры в кластеры и считает задачи одновременно. Но если чип NVIDIA может справляться с появляющимися вдруг в коде гетерогенными задачами, чип ATI передает эти задачи центральному процессору. На первый взгляд, такой подход должен замедлять общую работу системы, но на практике он выливается в большую скорость работы — все-таки CPU, даже при учете времени на передачу данных туда-сюда, справляется с потоковыми вычислениями быстрее, чем GPU.

На этом преимущества FireStream заканчиваются. В отличие от CUDA эта система использует не общепринятый, а свой собственный язык программирования, поэтому учиться работать с ней гораздо сложнее. Кроме того, сам язык еще недоработан, компилятор тоже не идеален, из-за чего код программы зачастую получается неоптимизированным и громоздким.

По-настоящему сравнить производительность CUDA и FireStream пока не удалось никому: единственная программа, которая официально работает с обеими системами, Cyberlink PowerDirector , сама не отличается оптимизированным кодом, поэтому говорить о точности результатов не приходится. Если смотреть на чистые цифры, технология AMD опережает детище NVIDIA при перекодировании видео. Но при этом качество картинки, которое выдает на выходе CUDA, получается более высоким, чем качество той же картинки от AMD. Возможно, всему виной недоработанные технологии, возможно — разница в подходах к выполнению задачи. Как бы там ни было, сравнивать готовый продукт с неготовым бессмысленно, так что мы лучше подождем, когда FireStream будет дописана до конца. Ждать, скорее всего, придется долго. Ведь AMD в отличие от NVIDIA не ставит разработку системы GPGPU в число наивысших приоритетов (как и собственный графический движок, кстати) и потому не называет никаких сроков.

Все желающие проверить эффективность работы FireStream могут скачать пакет разработчика ( http://developer.amd.com/gpu/ATIStreamSDK/Pages/default.aspx ).

Не конкуренты

Не утихают споры о том, нужны ли все эти аппаратные ускорения от NVIDIA и AMD, если на свет вот-вот появится долгожданный фреймворк OpenCL, которому суждено стать краеугольным камнем всей индустрии графических расчетов? Большинство спорщиков считает, что ни CUDA, ни FireStream при таком раскладе никому не нужны. Но есть нюансы.

Дело в том, что OpenCL (точно так же, как до него OpenGL и OpenAL ) — это всего лишь язык программирования. На котором, да, очень удобно кодить разного рода графику, от игр и мультфильмов до сложнейших моделей белков и метеорологических процессов. Но сам по себе OpenCL ничего не считает и считать не может: он все равно, так или иначе, опирается на железо, с которым работает. И поддержка вычислений общего назначения силами GPU, о которой идет речь в документации к новому фреймворку, — это не что иное, как поддержка технологий, при помощи которых эти самые вычисления производятся.

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

Точно так же обстоят дела и с грядущим Direct3D 11. Так, например, в Windows 7 этот фреймворк позволяет использовать аппаратные средства для перекодирования видеофайлов: при наличии соответствующих железа и драйверов это будет делаться при помощи NVIDIA CUDA, при отсутствии — силами центрального процессора.

Таким образом, ни OpenCL, ни Direct3D 11 конкурентами продуктам NVIDIA и AMD не являются. Напротив, они созданы для того, чтобы с ними эффективно взаимодействовать. Ведь включить ту же CUDA для поддержки существующих сегодня игр уже можно, но пока что это не очень эффективно: переключение между стандартным режимом работы видеокарты и режимом CUDA занимает слишком много времени, и драгоценные fps теряются. Решить эту проблему должны вычислительные шейдеры, которые разбиваются на потоки еще на «верхнем» уровне выполнения программы, и видеокарта благодаря этому получает на просчет данные одного типа — производительность от этого увеличивается, а нагрузка на видеокарту падает.

* * *

Использование GPU для расчетов общего назначения — это такое же неизбежное будущее, как многоядерные процессоры и многотерабайтные жесткие диски. Технология давно уже перешла из разряда любительских в категорию необходимых: на ее основе строятся целые вычислительные кластеры, программируются операционные системы и программное обеспечение, пишутся игры.

Благодаря технологии CUDA появилась на свет концепция ION, где центральный процессор играет роль вспомогательного инструмента и потому не обязан отличаться ни особенной многоядерностью, ни безумной производительностью. Благодаря концепции GPGPU компьютеры становятся дешевле и доступнее, учатся решать все более и более сложные задачи. Впрочем, списывать CPU с парохода истории пока еще очень рано — мощности его еще есть куда наращивать.

[[BREAK]] Считаем вместе

Идея распределенных вычислений предельно проста: если у нас нет достаточных мощностей для решения задачи и нет денег на то, чтобы эти мощности приобрести, почему бы не попросить у кого-нибудь помощи? Так или примерно так подумали ученые из Стенфордского университета, когда их лабораторный компьютер написал на экране, сколько сотен лет он будет просчитывать структуры белков по заданной программе. Цифра была столь внушительной, что ни о какой покупке нового компьютера с деканатом можно было и не заговаривать: чтобы решить такие задачи, закупать надо было целый парк суперкомпьютеров, а на это руководство университета идти не собиралось.

Помощи ученые стали искать в интернете. Создали свой сайт, написали программное обеспечение и предлагали всем желающим потратить немного компьютерного времени на науку. Для того чтобы помочь исследователям, достаточно было установить на свой компьютер соответствующее ПО и выйти в Сеть. Дальше владелец компьютера мог спокойно заниматься своими делами, в то время как его машина скачивала из интернета необходимые данные и три-четыре часа их просчитывала. Несмотря на явное отсутствие выгоды для участников программы, популярность ее была огромной: каждый день на сайте регистрировалось несколько сотен новых участников.

Помочь науке можно и сегодня. Правда, для этого вам лучше иметь видеокарту с поддержкой CUDA, потому что большая часть вычислительных программ сейчас построено именно на этой технологии. Сообщество World Community Grid ( www.worldcommunitygrid.org ) ищет лекарство от рака, проект Seventeen or Bust ( www.seventeenorbust.com ) занимается решением задачи Серпинского, SETI@Home ( http://setiathome.berkeley.edu ) расшифровывает сигналы с радиотелескопов, пытаясь найти в космосе братьев по разуму… выбирайте себе проект по душе и присоединяйтесь. Вам это, конечно, ничего не даст, но наука благодаря вашим усилиям продвинется хоть немного дальше.

240 параллель

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

Закончив расчет, ядро процессора записывает свои результаты в кэш-память, откуда результат тут же подхватывает другое ядро. Система работает практически непрерывно. Единственный минус такой архитектуры в том, что память процессором используется не очень эффективно. Для того чтобы данные не оказались записаны на один и тот же участок памяти, каждое ядро работает с определенным отрезком кэша: одно пишет, условно говоря, в кластеры от 0 до 25, второе — от 25 до 50 и так далее. Скорость чтения от такого разнобоя, разумеется, несколько падает — ведь получается, что процессор одновременно (и постоянно) обращается к разным физическим участкам памяти.

Графические процессоры устроены иначе. В них качество заменено количеством: вместо двух-четырех ядер, каждое из которых работало бы с частотой 3 с лишним МГц, графические чипы используют целые кластеры из 240 потоковых процессоров по 1-1,5 МГц каждый. Такая система хороша тем, что, помимо физических кластеров, можно использовать при расчетах и кластеры логические, то есть под каждую определенную задачу данные разбиваются ровно на такое количество групп, которое необходимо для просчета. За счет этого производительность при параллельных расчетах (когда все части программы считаются одновременно) подскакивает до небес.

Работа с памятью у GPU тоже построена иначе: поскольку все ядра всегда считают одновременно и результаты их расчетов никак не связаны между собой, беспорядочный доступ к памяти не нужен. Вместо этого специальная группа процессоров (называемая началом потока) периодически проходится по всем кластерам и обменивается с ними информацией, чтобы последовательно записать ее в память или прочесть из памяти. При расчетах графики такая система дает безумные цифры производительности. Но стоит загрузить GPU какой-нибудь традиционной компьютерной задачкой вроде запуска операционной системы или обработкой информации, которую вы набираете в Word, как процессор тут же начнет буксовать: организация GPU-памяти для решения последовательных задач крайне неэффективна.

Суперкомпьютер нового поколения

В начале года компания NVIDIA решила лишний раз напомнить всем о том, что технологии расчетов общего назначения силами графического процессора — это не просто игрушки для любителей. Суперкомпьютер NVIDIA Tesla , созданный по этой технологии, способен заменить собой целый парк суперкомпьютеров, основанных на идее расчетов силами CPU. Он состоит из множества кластеров, в каждом из которых есть своя графическая плата с 240 потоковыми графическими процессорами на борту. Даже «домашнее» решение Tesla, простой системный блок с одним таким кластером на борту, обеспечивает прирост производительности в 250 раз по сравнению с системами, производящими аналогичные вычисления силами топовых моделей Core i7. Что уж говорить о кластерных решениях для дата-центров?!

Практика счета

Прежде всего новые технологии GPGPU завоевали сердца ученых. Общество содействия науке имени Макса Планка (независимая некоммерческая исследовательская организация, основное подразделение которой располагается в Германии) первым пошло навстречу прогрессу и оплатило установку суперкомпьютера Tesla на основе технологии CUDA в лаборатории профессора Хольгера Штарка и его группы в Геттингенском институте (Германия).

Профессор занимался исследованиями в области 3D-электронной криомикроскопии — изучал строение и пространственное движение мельчайших наномолекулярных структур. Команда профессора Штарка использовала электронный микроскоп для получения детального 3D-изображения молекул. В принципе, разрешение современных микроскопов столь велико, что в них можно рассмотреть даже расстояния между атомами, но только вот биологические структуры, с которыми работали ученые, быстро разрушались от воздействия интенсивного потока электронов. Поэтому эти самые структуры хорошенько замораживают, а потом используют очень маленькую порцию электронов, чтобы их не повредить. Изображение в итоге получается очень шумным, но специальная обработка позволяет решить эту проблему. И вот тут ученые уперлись в несовершенство современных компьютерных систем. За 7 дней команда Штарка обработала 15 000 изображений, используя 48-ядерный CPU-кластер. С такой скоростью обработка миллиона файлов (а это минимум, необходимый для исследований) заняла бы чуть меньше полутора лет — и так для каждой молекулы. Установка компьютера, работающего на основе технологии CUDA, буквально спасла ученых: обработка миллиона изображений на нем занимает 14 часов (что более чем в 800 раз быстрее, чем работа CPU-кластера), и это, в общем-то, в минимальной комплектации. Добавление еще одного GPU-кластера уменьшило время обработки изображений до 9 часов.

Комментарии
Чтобы оставить комментарий,Войдите или Зарегистрируйтесь