Технологии высокопроизводительных вычислений

Автор работы: Пользователь скрыл имя, 26 Марта 2012 в 23:27, лекция

Краткое описание

Технологии высокопроизводительных вычислений сегодня переживают весьма резкие качественные изменения. Круг вопросов, подлежащих обсуждению при систематическом изложении предмета, не устоялся и стремительно меняется. По этой причине мы разделим настоящий текст на две части.
В первой части, озаглавленной «Освоенные технологии», изложим предмет так, как его надо было рассказывать, скажем, 2 – 3 года назад, не забывая, конечно, о линейном, количественном развитии, имевшем место за эти 2 – 3 года в рамках традиционных подходов.

Содержание работы

Введение.
Часть 1. Освоенные технологии.
1. Таксономия суперкомпьютеров и применяемых в связи с ними программистских технологий.
1.1. Архитектура фон Неймана.
1.2. Три этапа развития суперкомпьютерных технологий и две суперкомпьютерных революции.
1.3. Способы объединения многих процессоров в единую систему.
1.4. Альтернативные архитектуры.
1.5. Простейшая модельная программа.
1.5.1. Решение двумерной краевой задачи для уравнения теплопроводности методом Якоби.
1.5.2. Параллельная реализация «на бумаге».
1.5.3. Что потребуется для параллельной реализации на практике.
1.6. Общий состав программного обеспечения вычислительного кластера
1.7. Некоторые основные определения.
1.8. Технологии параллельной обработки данных без использования суперкомпьютеров.
2. Некоторые основные понятия архитектуры процессоров и ОС.
2.1. Некоторые основные определения.
2.2. Пример системы команд: обработка данных в памяти.
2.3. Чего нам не хватает.
2.3.1. Общее представление об управлении внешними устройствами.
2.3.2. Программа – диспетчер.
2.3.3. Прерывания.
2.3.4. Защита памяти и многорежимность процессора.
2.3.5. Виртуальная память.
2.4. Еще несколько определений.
3. Критерии эффективности коммуникационной сети.
4. Обзор процессорных и сетевых решений, применяемых в современных кластерах.
4.1. Выбор процессора.
4.2. Выбор коммуникационной сети.
5. Суперкомпьютер МВС-1000 и метакластер МВС-900.
5.1. Основные принципы организации МВС – 1000.
5.2. Как работает и зачем нужен метакластер МВС – 900.
6. Модели и технологии параллельного программирования.
6.1. Два способа параллельной обработки данных.
6.2. Два лица программистской модели.
6.3. Модель: явный двусторонний обмен сообщениями.
6.4. Модель: односторонний обмен сообщениями.
6.5. Модель: NUMA.
6.6. Модели, производные от явного двустороннего обмена сообщениями.
6.6.1. Модель библиотек коллективных операций над распределенными массивами.
6.6.2. Модель параллельных трансляторов в стиле HPF.
6.6.3. Модель непроцедурных языков.
6.7. Парадокс неприятия новых технологий.
6.8. Немного о технике реализации MPI.
Часть 2. Технологии, появляющиеся сегодня.
7. Почему «эпоха кластеров» заканчивается.
Литература.

Содержимое работы - 1 файл

Технологии высокопроизводительных вычислений.doc

— 495.50 Кб (Скачать файл)

2.3.2. Программа – диспетчер.

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

Очевидно, в результате «холодного пуска» - с перфокарт (в описанной выше М-20), или из микросхемы постоянного запоминающего устройства (в современных машинах) в оперативную память попадает лишь очень простая и короткая программа – начальный загрузчик. Затем она  читает с диска более сложную программу, которая, попав в память, остается в ней постоянно, выполняя запросы пользователя на чтение с диска и запуск (в оставшейся части памяти) других программ. Такую программу будем (пока) называть программой – диспетчером. Было бы логично включить в состав диспетчера также набор стандартных подпрограмм, которыми могли бы располагать программы пользователей для управления внешними устройствами. Например, полезна была бы подпрограмма «выдать в com-порт заданную строку символов». Для общения программ пользователей с устройствами, более сложными, чем com-порт, такая базовая библиотека ввода-вывода просто жизненно необходима. Ведь устройства ввода-вывода могут быть не просто сложными, но и разными (на уровне конкретных регистров управления), а базовая библиотека могла бы скрыть всю эту утомительную специфику от прикладного программиста.

2.3.3. Прерывания.

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

В действительности, никаких «команд переключения» в процессоре нет. Вместо этого реализован (аппаратно, в процессоре) механизм прерываний. Прерывание – это принудительный (никак не записанный в программе) переход по определенному адресу в результате наступления некоторого события. Событие может быть внутренним (для процессора) – например, деление на 0, или внешним – например, нажатие клавиши на клавиатуре. Практически всегда процессор снабжается специальным источником внешних прерываний – таймером, поставляющим, независимо ни от чего, внешние события, например, 1000 раз в секунду.

Переход по определенному адресу при прерывании сопровождается аппаратным сохранением (также по определенному адресу) того минимального объема сведений о состоянии процессора, который необходим, чтобы из прерывания можно было вернуться, а прерванная программа «ничего не заметила». Например, абсолютно необходимо сохранение счетчика команд в момент прерывания – иначе неизвестно, куда возвращаться.

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

Как правило, внешние устройства генерируют прерывания, устанавливая в «1» бит готовности в том или ином регистре состояния. Именно прерывания (от таймера и внешних устройств) и дают возможность программе – диспетчеру переключать процессор между разными программами теми самыми «мелкими порциями». Важно понимать, что прерывания в большинстве своем прозрачны для программы пользователя – результат ее выполнения никак не зависит от того, сколько и каких прерываний, например, от таймера произошло во время счета, и в каких именно местах программу временно останавливали, переключая процессор на другую. Логически программа выполнялась так, как если бы она выполнялась на отдельном процессоре.

Оснастив нашу программу – диспетчер правильно настроенным аппаратом обработки прерываний, и, на этой основе, возможностью псевдо- параллельного выполнения прикладных программ, каждая из которых написана как последовательная, мы вправе назвать, наконец, такую программу – диспетчер операционной системой. Теперь она уже может (в принципе) делать все, что делает Windows или Linux. За двумя небольшими исключениями. Наша операционная система (очень похожая, кстати, на MS DOS по набору принципиальных возможностей) не имеет аппарата виртуальной памяти и не обеспечивает защиту себя и прикладных программ друг от друга. Эти две недостающие возможности строятся на общем фундаменте, что позволяет нам рассмотреть их вместе.

2.3.4. Защита памяти и многорежимность процессора.

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

Рассмотренная выше система команд, как мы видели, оперирует 12-разрядными адресами. Разделим (сначала мысленно) 12-разрядный адрес на два поля: старшие 3 разряда назовем номером страницы, а оставшиеся младшие 9 разрядов – смещением в странице.

Теперь добавим к аппаратуре процессора таблицу приписки, состоящую из 8-ми страничных регистров. Пока будем считать, что регистр приписки состоит из 3-х битов, как и номер страницы.

Смысл таблицы приписки – в том, чтобы модифицировать адреса команд и данных, с которыми процессор обращается в память.

Рассмотрим работу регистра приписки номер 5, и предположим, что в нем находится значение 3.

Регистр приписки номер 5 срабатывает всякий раз, когда адрес, с которым процессор обратился к памяти, содержит в старших трех разрядах значение 5, то есть попадает в 5-ю страницу. Характер обращения к памяти не важен – это может быть обращение с записью результата некоторой команды, обращение за самой командой и т. п. При любом таком обращении с адресом происходит одно и то же: его старшие разряды (а именно – число «5», номер страницы) заменяются на содержимое 5-го регистра приписки (в данном случае – на число 3). 5-я страница как бы «перенаправляется» на 3-ю. Для программы это перенаправление прозрачно – она работает так, как если бы никакой приписки не было, а 5-я страница памяти была в ее распоряжении.

Адреса, которыми оперирует программа, называются виртуальными, а адреса, уже преобразованные системой защиты памяти – физическими.

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

 

Несколько технических замечаний.

 

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

В некоторых специализированных процессорах этот аппарат может отсутствовать, но в универсальных процессорах он есть всегда.

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

 

Легко видеть, что страничная приписка, действительно, способна защитить разные программы от «затирания памяти» друг другом. Но как защитить их от «затирания» самой таблицы приписки? Для этого придется ввести еще одну аппаратную возможность – многорежимность процессора. Обычно в процессоре предусматривают два режима: режим супервизора и режим пользователя. Операционная система выполняется в первом, прикладные программы – во втором. В режиме пользователя некоторые команды не работают (точнее, вызывают прерывание по запрещенной команде). Такие команды называются привилегированными. К числу привилегированных относятся команды, при помощи которых можно изменить приписку. Таким образом, сделать это может только операционная система. Сама команда смены режима процессора – также привилегированная. Как же процессор попадает из режима пользователя в режим супервизора? В результате прерываний. При прерывании автоматически включается режим супервизора. При возврате из обработчика прерывания операционная система его выключает.

 

Замечание об управлении внешними устройствами.

 

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

Как же, в таком случае, программа пользователя пишет, например, данные на диск? Очевидно, она делает это не непосредственно, а путем обращения к операционной системе «с просьбой» сделать это «за нее». Такое обращение прикладной программы к операционной системе за услугой (обычно – за вводом – выводом) называется системным запросом. При исполнении системного запроса должно произойти переключение процессора из режима пользователя в режим супервизора. Команда (или команды) обращения к подпрограмме такого переключения выполнить не могут. Как же конкретно (на уровне команд) выглядит системный запрос?

Мы знаем, что переход в режим супервизора происходит при прерывании. Для обращения к операционной системе с запросами предназначен специальный вид прерываний – программные прерывания. В отличие от прерываний по внешним событиям (нажатие на клавишу, завершение обмена с диском, срабатывание таймера) или по аварийным ситуациям (деление на 0, обращение к несуществующей странице памяти), программные прерывания явно инициируются специальными командами процессора – командами программных прерываний. Смысл программного прерывания состоит в том, чтобы  программа могла явным запросом включить режим супервизора. Чтобы выполнить системный запрос, прикладная программа заносит в некоторое фиксированное место (например, на регистры общего назначения процессора) код запроса и параметры, говорящие о том, в чем конкретно заключается запрос, а затем выполняет команду программного прерывания, передавая тем самым запрос операционной системе. Выполнив запрос, ОС возвращает управление прикладной программе в режиме пользователя. Конечно, системный запрос не обязан касаться только управления внешними устройствами. Это может быть, например, запрос на изменение таблицы приписки («дай страницу»).

2.3.5. Виртуальная память.

Посмотрим, как с помощью только что описанных возможностей реализуется такая часто упоминаемая функция ОС, как предоставление прикладной программе виртуальной памяти. Для того, чтобы понять, как прикладная программа может, например, пользоваться памятью большего объема, чем реально есть в компьютере, достаточно мысленно добавить в регистр состояния страницы в таблице приписки всего один бит – бит, говорящий о том, что данная страница отсутствует. Когда в ходе выполнения программы происходит обращение к такой странице, происходит прерывание по отсутствующей странице. Обрабатывая это прерывание, ОС находит на диске временно «откачанную» туда копию этой страницы, читает ее с диска в некоторое место в памяти, настраивает регистр приписки на это место в памяти и возвращает управление прикладной программе, причем на ту самую команду, которая не смогла выполниться, вызвав прерывание. Таким образом, прикладная программа, в итоге, «ничего не замечает».

2.4. Еще несколько определений.

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

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

Технически системные запросы реализуются обычно через команды программных прерываний. Процесс выполняется в рамках виртуальной машины.

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

Часть операционной системы, которая выполняется в режиме супервизора, содержит обработчики прерываний и предоставляет прикладной программе виртуальную машину, называется  ядром. Сменные модули ядра, предназначенные для обслуживания отдельных внешних устройств, называются драйверами. Вспомогательные части операционной системы, которые сами выполняются в рамках процессов и, тем самым, не являются частью ядра, а являются «служебными программами», обычно называют демонами.

3. Критерии эффективности коммуникационной сети.

Материал этого раздела практически без изменений заимствован из [1].

Производительность, латентность и цена обмена.

Производительностью канала «точка – точка» между узлами A и B будем называть количество данных, передаваемых по каналу в единицу времени, в среднем за некоторый большой промежуток астрономического времени – скажем, за минуту. Производительность канала можно представить себе как среднюю (за длительное время) скорость передачи данных. Очевидно, производительность канала сильно зависит от того, какой длины сообщения используются при передаче данных, то есть от того, как часто канал «останавливается», с тем, чтобы потом снова «разогнаться».

Информация о работе Технологии высокопроизводительных вычислений