РЕАЛИЗАЦИЯ ПАРАЛЛЕЛЬНЫХ ВЫЧИСЛЕНИИ В
МНОГОПРОЦЕССОРНЫХ СИСТЕМАХ
Жоранова Н.Ж.
Многие
задачи требуют вычислений с большим количеством операций, которые занимают
значительные ресурсы даже современной техники, более того, можно с уверенностью
читать, что каких бы скоростей ни достигла вычислительная техника всегда
найдутся задачи, на решение которых потребовалось значительное время. Многие из
таких сложных задач требуют, чтобы результат был получен за как можно меньшее
время или даже строго ограниченное. К таким задачам, например, относится
прогнозирование погоды, обработка изображений и распознание образов при
управлении техникой. С другой стороны представляет большую техническую проблему
уменьшение времени исполнения каждой операции в микропроцессоре.
Очевидным способом
увеличить скорость вычислений было бы применение не одного вычислительного
устройства, а нескольких, работающих совместно над решением одной задачи. Такой
подход носит название параллельных вычислений. Несмотря на кажущуюся
простоту решения оно является подчас весьма нетривиальной задачей по проектированию
вычислительной техники и разработки алгоритмов. Первая проблема кроется в том,
что для того, чтобы задачу можно было решить с помощью параллельных вычислений
алгоритм её решения должен допускать распараллеливание, мало того, далеко не
каждая задача может быть решена параллельным алгоритмом. Другой же, не менее
важной проблемой является построение системы, на которой бы возможна была
реализация параллельных вычислений.
Существует
два основных подхода к распараллеливанию вычислений в микропроцессорных системах, называемые
однопоточным и многопоточным паралеллизмом. Различие заключается в
использовании одного или нескольких потоков
исполнения для паралельных вычислений.
Однопоточный
паралеллизм заключается в параллельном выполнении операций внутри
одного потока исполнения. Возможность однопоточного паралеллизма определяется
архитектурой микропроцессора, а конкретно его способностью считывать из памяти
и исполнять одновременно несколько операций.
Многопоточный
паралеллизм — использование нескольких потоков для достижения
параллельного исполнения операций. Для того, чтобы обеспечить многопоточный
паралеллизм необходимо создать систему с несколькими процессорами или
процессорными ядрами.
Принципы
организации однопоточного и многопоточного паралеллизма, их особенности,
достоинства и недостатки очень различны, и имеют мало общего как в реализации
вычислительной системы, так и в построении программного обеспечения.
Однопоточный паралеллизм
Как
уже написано выше, однопоточный паралеллизм реализуется внутри одного потока
исполнения. Возможность однопоточного параллельного исполнения почти целиком
лежит на архитектуре микропроцессора
— именно она определяет способность микропроцессора выполнять инструкции
параллельно.
Однопоточный
паралеллизм обладает своими достоинствами и недостатками. Достоинства:
§
Отсутствие необходимости синхронизации — все операции
выполняются внутри одного потока, и
следовательно, в строго определённой последовательности.
§
Отсутствие необходимости поддержки паралеллизма на
уровне операционной системы.
§
Отсутствие необходимости в средствах управления
разделяемыми ресурсами (арбитража).
Недостатки:
§
Затруднённость использования в алгоритмах с условными
переходами.
§
Необходимость адаптации программы для эффективного
использования ресурсов микропроцессора, например, при переходе с одной модели
на другую.
Существуют
следующие методы достижения параллельных вычислений:
§
Упаковка данных для групповой обработки единичными
инструкциями применением специальных методик. Например, возможно сложить две
пары 8-битных данных 16-битной операцией исключив возможность переполнения.
Метод имеет очень ограниченное применение.
§
Суперскалярная архитектура. Устройство управления микропроцессора самостоятельно анализирует
поток инструкций на предмет возможности параллельного исполнения и управляет
нескольких функциональными устройствами.
Векторная
обработка. Микропроцессор имеет инструкции, производящие групповые однотипные
операции. Однотипные операнды упаковываются в один векторный регистр. Этот
метод аналогичен первому, но обеспечение параллельности лежит на
микропроцессорной архитектуре. Векторные регистры как правило имеют большую
разрядность. Требуется адаптировать программу для использования векторных
инструкций или применять оптимизирующий компилятор.
§
Микропроцессор с явным паралеллизмом. Метод аналогичен
второму, но программа для такого процессора содержит явные указания на то,
какие операции надо выполнять параллельно. Распараллеливание вычислений в
данном случае полностью лежит на программисте или оптимизирующем компиляторе.
Поэтому были разработаны
специальные технологии для создания многопроцессорных систем. Которые позволяли
обрабатывать данные параллельно, а, следовательно, быстрее. Соответственного
создавались операционные системы поддерживающие многопроцессорные технологии.
Такие как: Solaris (Sun Microsystems), Unix-подобные
OS: Irix (SGI), AIX (IBM); Linux RedHat; Windows XP. Рассмотрим операционную
системы Solaris версии 2.4. Solaris 2.4 - это Unix-подобная система,
разработанная Sun Microsystems.
В
операционной системе Solaris 2.4 существует такое понятие как поток. Поток (thread) — это последовательность инструкций
выполняемых в пределах контекста процесса. Эта операционная система
поддерживает многопоточные процессы. Слово «многопоточные» подразумевает
содержание множества управляемых потоков. Традиционный UNIX процесс содержит
один управляемый поток. Многопоточный в свою очередь содержит множество
потоков, которые выполняются независимо. Так как каждый поток выполняется
независимо, распараллеливание кода программы приводит к:
§
Улучшению чувствительности приложения,
§
Использование многопроцессорности более эффективно,
§
Улучшает структуру программы,
§
Использование меньше ресурсов системы,
§
Улучшение представления.
Определение
одновременного и параллельного исполнения. Одновременность имеет
место, когда не меньше двух потоков в процессе в одно время. Параллельность
возникает, когда не меньше двух потоков выполняются одновременно. В
многопоточном процессе на одном процессоре, процессор может распределять
ресурсы между потоками, в результате получаем одновременное выполнение. В
похожем многопоточном процессе на общей памяти в многопроцессорной системе,
каждый поток в процессе может выполняться на отдельном процессоре в одно и то
же время, в результате получаем параллельное выполнение. Когда процесс имеет
столько же потоков, или меньше, сколько и процессоров, то система поддержки
потоков и операционная система «уверены», что каждый поток исполняется на своём
процессоре.
Потоки
видны только внутри процесса, когда они разделяют ресурсы процесса такие, как
адресное пространство, открытые файлы, и т. д. Каждая нить имеет уникальные ID,
регистр, стек, маску, приоритет. Т.к. потоки делят инструкции процесса и
большинство данных, изменения данных одним потоком видно другими потоками в
процессе. Когда поток должен взаимодействовать с другими потоками процесса, он
может сделать это без привлечения операционной системы. Потоки это главный
программный интерфейс в многопоточном программировании. Потоки
пользовательского уровня управляются в пользовательском пространстве и поэтому
могут запрещать контекстному ядру переключение ресурсов. Приложение может иметь
тысячи потоков, и не потреблять много ресурсов ядра. Количество ресурсов ядра,
потребляемых приложением, во многом определяется самим приложением. По
умолчанию потоки «легковесны». Для получения большего контроля за потоками,
приложение может ограничивать потоки. Когда приложение ограничивает потоки в
доступе к ресурсам, поток становится ресурсами ядра. Функции для работы с
потоками, такие как thr_create(….), thr_self(), thr_join(….) и т. д., описаны в
библиотеке libthread. Функция thr_create создает поток в зависимости от
заданных параметров. Функция thr_join объединяет потоки в параллельный процесс.
Функция thr_self возвращает номер потока в процессе.
Использование
большего числа процессоров ускоряет работу программы и не сильно усложняет
работу программистов. Следовательно, при работе с большим количеством данных
рациональнее использовать многопроцессорные системы.
Так,
согласно наблюдению, получившему впоследствии название "закон Мура", примерно до 2000–2001 года число
транзисторов на кристалле удваивалось каждые два года, при этом росла и
тактовая частота. Но с начала двухтысячных годов технология
производства изменилась. Развитие доступных серверных процессоров пошло не
путем повышения тактовой частоты, а в сторону добавления процессоров. Сейчас же
увеличивается не только количество ЦПУ, но и число их ядер. Это произошло
потому, что теперь при разработке кристаллов задействуются
нанотехнологии и возникают уже физические ограничения, определяемые, в частности,
размерами атомной решетки.
На
сегодняшний день параллельные вычисления используют небольшое количество
программ. Это связано, в первую очередь, с тем, что разработка приложений,
использующих параллельные вычисления,сложнее, и более трудоемка, чем при использовании
традиционных последовательных вычислений.
Современные СУБД используют многопоточные схемы
работы, и на первый взгляд кажется, что параллельность вычислений
обеспечивается автоматически. Каждому пользователю соответствует свое
соединение, работающее в отдельном потоке.
Пользователи
могут посылать свои запросы к СУБД абсолютно параллельно. Проблема в том, что не все запросы(под
запросами подразумеваются в том числе операции на изменение) могут быть
обработаны параллельно.Это обусловлено логикой и проблемами, связанными с
грязным” чтением. В MSSQL
неэффективно настроенный блокировочный механизм не позволит всем пользователям
работать максимально параллельно с системой. Это возможно только для систем, у
которых все запросы идут только на чтение. Также отдельно стоит выделить
регламентные процедуры с длительным временем выполнения. В ряде случаев они
могут быть хорошо распараллелены и соответственно, ускорены, но для этого их
нужно соответственным образом запрограммировать. В противном случае, регламентная
процедура будет выполнятся в одном потоке и использовать ограниченные серверные
ресурсы и соответственно будет выполнятся значительно дольше.
Можно
привести пример для задач моделирования. Например, задача расчета траектории
взаимодействующих между собойN физических
тел. Подобные задачи решаются, как правило, путем
компьютерного моделирования. Предполагается, что, если интервал времени разбить
на небольшие кусочки, то можно итерационно рассчитывать новую координату для
каждого из тел. Чем меньше интервал времени, тем выше точность расчетов. Раньше
в однопроцессорных серверах не было смысла данные задачи распаралелливать. В
цикле соответствующему множеству всех тел рассчитывалась координата каждого. Также необходим пул сессий 1С и координатор задач, который
будет выдавать каждой сессии 1С свой документ на проведение. Как только сессия
проводит документ и освобождается, координатор выдает ей новый на проведение.Вы
спросите, а как же последовательность, а точнее хронология? За это отвечает
координатор блокировок. Если документ связан с проводимыми в данный момент
другими документами на уровне данных, например, номенклатура или клиент, тогда
он будет ожидать своей очереди. Если же документ никак не связан, то он будет
проводиться параллельно. Каждый отдельный процессор будет параллельно
обрабатывать проведение своего документа, за счет чего будет ускорение. В
данном случае, если данные не сильно связаны друг с другом, то ускорение может
быть очень существенным, иногда в 10-ки раз. Разумеется, это зависит и от
серверных ресурсов. На слабых серверах ускорение будет незначительным.
Сейчас многие языки поддерживают
многопоточность и возможность параллельных вычислений. Но,на мой взгляд, это
сделано неудобно для разработчиков. Сложность разработки перекрывает плюсы от
возможностей масштабируемости системы.
Литературы:
1.Немнюгин С.,
Стесик О. Параллельное программирование для многопроцессорных систем. СПб.:
БХВ-Петербург, 2002. 400с.
2. Антонов А.С.
Параллельное программирование с использованием технологии MPI. М., из-во МГУ, 2004
3. Жангисина
Г.Д. Параллельные вычисления и
многопроцессорные ЭВМ в решении научно-технических задач. Алматы: АТУ, 2006.-1 экз.