Ваше местоположение в сети:
Рубрика:

Параллельное программирование

Разделы сайта:

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

Так что если вы ищите информацию про то, как подступиться к параллельному программированию, пропускайте начало статьи и переходите к концу.

А пока...

Программирование

Что вообще представляет собой это занятие? Грубо говоря, программа - это последовательность инструкций для компьютера. Причем, инструкций четких, все должно быть формализовано. Классическая программа получает данные на вход, перерабатывает и выдает что-то в ответе. Собственно, когда-то только так с программой и можно было взаимодействовать, а код самой программы набирался на перфокарте.

Перфокарта

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

Программирование - это, можно сказать, попытка систематизировать хаос. Вы знаете, что должно происходить на экране, что должно сохраняться, но эти понятия расплывчаты. А теперь ваша задача - перевести все эти понятия на строгий формализованный язык программного кода. Прикладное программирование может превращаться в рутинную работу. Если вы уже сто раз выполняли подобные задачи, то выполняете ее в сто первый на автомате. Но научное программирование сродни искусству. Программируя для науки вы никогда не уверены в том, что идете по правильному пути, что выбранная модель работает лучше другой или работает вообще.

Параллельное программирование

С отображением результата на экране все понятно. Но вот действия, которые программа должна произвести "за кадром" иногда занимают достаточно много времени. Естественный вопрос для разработчика - как ускорить выполнение программы? Конечно, можно посоветовать пользователю использовать более быстрый компьютер, но это решение очень ограничено, да и скорости компьютеров сейчас несильно увеличиваются. А вот что увеличивается - это количество ядер на компьютере.

Что дают эти ядра? Возможность независимо запустить несколько программ так, чтобы они не мешали друг другу. На четырехядерном компьютере вы можете одновременно запустить четыре линейных программы, требующих полной загрузки, и производительность не упадет. Возникает вопрос: а можно ли так сделать, чтобы одна программа стала работать в четыре раза быстрее?

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

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

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

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

Практика

Если вы собираетесь заняться параллельным программированием, то рекомендую делать это на C, плюс установить на свой компьютер Линукс. Существуют такие варианты.

  • Posix threads: прямое управление "нитками" - независимыми потоками инструкций, способными выполняться в параллели. Нитке на вход передается функция и параметры. Вычисление выполняется в общей памяти. Синхронизация выполняется при помощи функций ожидания, условий, барьеров и том подобных вещей. Подробности тут
  • OpenMP: использует вышеупомянутые нитки, но позволяет пользователю создавать их в автоматическом режиме. Подходит, когда нужно параллелизовать, например, циклы в программе, имеет ограниченную применимость. Введение в OpenMP.
  • MPI: message parsing interface. Позволяет запускать программу сразу на нескольких компьютерах. Применяется на вычислительных кластерах. Здесь нет создания, запуска и остановки ниток, программа сразу запускается на нескольких компьютерах, инициализируется и выполняется параллельно. Однако, благодаря тому, что каждая копия знает свой уникальный номер, можно разделять, кто и что будет выполнять. Почитать побольше можно здесь.
  • GPU: программирование на видеокарточках. Тема для отдельной статьи.

Так или иначе, за параллельным программированием будущее. Разработчики ресурсоемких программ безусловно должны озаботиться параллелизацией своих алгоритмов.

← Google Chrome OSСайту - два года! →
comments powered by Disqus