Автор работы: Пользователь скрыл имя, 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. Почему «эпоха кластеров» заканчивается.
Литература.
Пусть узел A передает узлу B сообщение длиной X байтов, и при этом никаких других обменов в сети не происходит. Время T, затрачиваемое на такую передачу, довольно точно оценивается формулой:
T = X/S + L
где L не зависит от X.
В этой формуле, очевидно, S есть пропускная способность канала «точка – точка» на пустой сети, или, попросту, мгновенная скорость передачи данных. S измеряется в (мега)байтах в секунду.
Величина L, в свою очередь, представляет собой время запуска обмена, не зависящее от длины сообщения, и измеряется в (микро)секундах. На профессиональном жаргоне принято называть эту величину латентностью, и мы будем впредь поступать так же, чтобы не нарушать традицию, хотя это, возможно, и не совсем правильно с точки зрения терминологической строгости.
Иногда удобно оперировать латентностью, приведенной к скорости, или ценой обмена, которую мы обозначим как P:
P = L*S
Эта величина измеряется в байтах, и имеет несколько полезных «физических» интерпретаций. Прежде всего, цена обмена – это то число байт, которое канал «точка – точка» мог бы передать за время своего запуска, если бы «умел» запускаться мгновенно. Иными словами, за счет «инертности» канала, к каждому передаваемому им сообщению «как бы добавляется», с точки зрения скорости передачи, P байт.
Таким образом, производительность канала зависит от длин сообщений, используемых при передаче данных. Если X много больше P, то есть длины сообщений много больше цены обмена, производительность близка к пропускной способности. Напротив, если X много меньше P, производительность практически полностью определяется латентностью, а не пропускной способностью. Наконец, при X, равном P, производительность равна в точности половине пропускной способности канала. Тем самым, цена обмена – это такая длина сообщения, при использовании которой производительность канала равна половине его пропускной способности.
В итоге, мы сформулировали два независимых критерия эффективности: пропускную способность канала «точка – точка» на пустой сети и латентность, и один производный критерий – цену обмена. Очевидно, сеть тем лучше, чем выше пропускная способность, и чем ниже латентность. Так, в SMP – системе (машине с общей, симметрично адресуемой памятью) пропускная способность бесконечна, а латентность, теоретически, равна нулю.
Полнота сети.
Содержательно, полнота сети есть мера того, насколько несколько одновременно происходящих обменов «мешают» друг другу. Простейшее определение полноты сети – это понятие бисекционной полноты: сеть называется бисекционно полной, если любые обмены между разными парами узлов, происходящие одновременно и в любом количестве, совсем не мешают друг другу. Или, что то же самое, при любом разделении сети пополам (бисекции) пропускная способность потока данных из одной половины в другую есть сумма пропускных способностей независимых каналов, ведущих из одной половины сети в другую. Типичный пример бисекционно неполной сети – сеть на базе двух однородных коммутаторов, объединенных между собой единственной линией.
Рис. 3.1. Бисекционно неполная сеть.
Следует отметить, что при практической оценке пропускной способности реальной сети в режиме интенсивных перекрестных обменов модель бисекционной полноты недостаточна. Если сеть построена на базе центрального коммутатора (а так бывает чаще всего), то реальное время выполнения серии одновременных обменов, некоторые из которых пересекаются по участвующим процессорам, зависит от особенностей внутренней реализации коммутатора. Достаточно типична ситуация, когда два коммутатора разных моделей, каждый из которых реализует попарно независимые обмены без потери быстродействия, сильно отличаются по времени выполнения одной и той же тестовой серии частично пересекающихся обменов. Следует также отметить, что информацию о внутренней логике поведения коммутатора, по которой можно было бы предсказать его скоростные характеристики в этом режиме, добыть обычно не удается: производители ее не сообщают. При этом, в реальных задачах почти всегда имеет место именно такой режим, когда одни и те же процессоры участвуют одновременно в нескольких разных обменах. Поскольку достоверной информации о внутренней логике коммутатора у нас нет, практически мало целесообразно строить на эту тему какие-то сложные формализованные модели, основанные на выдуманных допущениях. При необходимости оценить качество коммутатора, или сравнить несколько коммутаторов между собой, разумно воспользоваться каким – либо простым эталонным тестом. Такой тест должен циклически, много раз подряд осуществлять обмены всех узлов со всеми сообщениями фиксированной длины X, причем X должно быть заметно больше цены обмена. Все обмены на одном узле должны запускаться одновременно, чтобы исключить их зависимость друг от друга по порядку выполнения. Если среднее время выполнения витка такого теста равно T, то легко подсчитать суммарный объем переданных за это время одним узлом данных D:
D = X*(N-1)
где N – число процессоров. Если бы сеть была идеальна, то есть никакой обмен не мешал никакому другому, этот объем данных мог бы быть передан из узла за время Ti:
Ti = D/S = (X*(N-1))/S
Предполагая канал, связывающий узел с сетью, дуплексным, то есть способным одновременно с передачей принимать данные с той же скоростью, и помня, что узлы работают одновременно, видим, что Ti представляет собой теоретически идеальное время срабатывания витка нашего теста. В действительности, тест будет выполнять виток за экспериментально измеренное время Te, очевидно, большее, чем Ti. Поделив одно на другое, получим экспериментальный коэффициент полноты Fe:
Fe = Ti/Te
Вне всякого сомнения, приведенное здесь определение экспериментального коэффициента полноты нельзя назвать определением в математическом смысле этого слова. Мы сделали слишком много не формализованных допущений. Конечно, значение коэффициента будет, при прочих равных, зависеть и от длины сообщения X, и от особенностей тестовой программы. Однако, приведенная здесь процедура экспериментальной оценки полноты сети обладает одним несомненным достоинством: она позволяет на практике измерить, на сколько процентов, в буквальном смысле этого слова, идеальной является наша сеть, с точки зрения ее полноты. Опыт показывает, что для сравнения между собой различных сетевых коммутаторов такой способ измерения весьма полезен. Конечно, если полученные на разных коммутаторах значения Fe отличаются на четверть, это мало о чем говорит, но на практике не редкостью являются отличия в несколько раз.
Потребность сети в вычислительной мощности.
Пусть некоторое вычисление – например, перемножение двух матриц – занимает время Tm. Выполним то же самое вычисление на фоне запущенного обмена, время завершения которого заведомо превосходит Tm. Теперь это же вычисление займет время Tc. Коэффициент замедления счета на фоне обмена C вычисляется по формуле:
C = Tm/Tc
Отметим, что для «более или менее разумной» сети C должно мало отличаться от единицы, то есть сеть не должна заметно потреблять вычислительную мощность узла.
В итоге, мы сформулировали четыре независимых критерия эффективности сети, важных с точки зрения ее практического использования. Таковыми являются:
- пропускная способность канала «точка – точка»,
- латентность,
- экспериментальный коэффициент полноты,
- потребность сети в вычислительной мощности.
4.1. Выбор процессора.
Видов процессоров (по используемой системе команд), на базе которых строятся рабочие станции серийного выпуска, пригодные в качестве узлов вычислительного кластера, на сегодня существует, в основном, три:
Pentium – совместимые процессоры [5,6],
Power [7],
Itanium – 2 [5].
Эти три вида процессоров имеют совершенно разные системы команд, никак не совместимые друг с другом. Для каждой из этих систем команд существуют реализации Linux.
Очевидной целью построения вычислительного кластера является максимально высокая производительность выполняемых прикладных программ, которая очень сильно зависит от качества применяемых трансляторов. Трансляторы gnu, входящие в состав Linux, по качеству генерируемого кода оставляют желать лучшего. Применение профессиональных трансляторов весьма желательно, но редко бывает возможным бесплатно. Поэтому важно понимать, на какой из систем команд потери от применения трансляторов gnu (если на профессиональный транслятор денег не нашлось) будут минимальными. Опыт показывает, что потери качества кода (для трансляторов gnu по сравнению с профессиональными, коммерчески доступными трансляторами) минимальны для Pentium – совместимых процессоров (примерно 30-50%), а на менее распространенных процессорах могут возрастать кратно. То же верно и в отношении качества реализации самой ОС (количества еще не обнаруженных ошибок). Поэтому действует правило: если нет явных, специальных оснований выбрать какой-либо совершенно конкретный процессор, выбирать надо Pentium – совместимый.
Часто рекламируемое превосходство процессоров Itanium-2 над Pentium – совместимыми процессорами, как показывает опыт, на практике не наблюдается, имеет место в основном при выполнении специально подобранных тестов, а не реальных задач.
К выбору типа процессора, на основе которого строится кластер, вплотную примыкают еще два важных решения: выбор числа процессоров (и/или процессорных ядер) в составе узла создаваемого кластера и выбор типа операционной системы (64-разрядной или 32-разрядной). Начнем с разрядности.
Говоря о разрядности процессора, часто имеют в виду, что 64-разрядный процессор быстрее выполняет вычисления над числами с двойной точностью, чем его 32-разрядный аналог. Это неверно. 32-разрядный Pentium или Power выполняет операции над 64-разрядными числами ничуть не медленнее, чем аналогичный по частоте 64-разрядный. Сегодня 64-разрядность процессора означает, практически, только то, что адреса команд и данных в программе являются 64-разрядными, то есть отсутствует «32-разрядное» ограничение на суммарный размер программы и всех ее данных.
Сказанное автоматически означает, что 64-разрядный и аналогичный ему 32-разрядный процессоры имеют разные системы команд. Верно ли это? Да, но не совсем.
Как Pentium – совместимые процессоры, так и процессоры Power когда-то были 32-разрядными, а сегодня выпускаются в 64-разрядной версии. Однако, из соображений совместимости программного обеспечения новая (64-разрядная) система команд была реализована не вместо, а в дополнение к уже существующей, 32-разрядной. Получился двухрежимный процессор (не путать с упоминавшейся выше многорежимностью в смысле «режим супервизора – режим пользователя»), то есть, фактически, два разных процессора в одном кристалле. Одновременно эти два режима работать не могут – в каждый конкретный момент времени процессор находится либо в 32-разрядном режиме (реализует старую систему команд), либо в 64-разрядном (реализует новую систему команд). Переключение режимов возможно через прерывания.
Если на машину, оснащенную таким процессором, устанавливается 32-разрядная операционная система, «ничего не знающая» о новой системе команд, процессор будет всегда работать в старом, 32-разрядном, режиме. Можно, однако, установить 64-разрядную операционную систему. Тогда сама ОС будет работать в 64-разрядном режиме, но исполняемые файлы прикладных программ она сможет запускать как «старые», так и «новые» (мы ведь уже знаем, что переключения процессора между разными прикладными программами, а также ядром, происходят через прерывания). Внутри прикладной программы переключение режимов невозможно: нельзя, например, оттранслировать свой код для 32-разрядного режима и собрать его с 64-разрядной библиотекой. Это то же самое, что пытаться собрать код для Itanium-2 с библиотекой объектных модулей для Macintosh.
Старая (32-разрядная) система команд Pentium называется IA-32. Новая (64-разрядная) называется x86-64, и была первоначально придумана и реализована AMD в процессорах Opteron [6], но сейчас принята также и фирмой Intel для процессоров Pentium [5]. Таким образом, процессоры AMD на сегодня от Pentium – совместимых процессоров Intel по системе команд не отличаются. Система команд Itanium-2 – 64-разрядная, называется IA-64, и с системой команд x86-64 не имеет ничего общего, кроме разрядности. Itanium-2 – процессор однорежимный (32-разрядной системы команд у него нет). Современные версии Power – двухрежимные, как и Pentium, разработанные для них версии Linux – тоже. Ни с Itanium-2, ни с Pentium/Opteron они по системе команд не совместимы [7].
Выбирая число процессоров (и/или ядер) на узле создаваемого кластера, следует выдерживать баланс между стремлением уменьшить размер и стоимость создаваемой установки, с одной стороны, и минимизацией конкуренции ядер за общую память – с другой.
Казалось бы, желание обеспечить как можно более тесную связь между процессорами (ядрами) в кластере диктует использование узлов с максимально возможным числом ядер на узле. В действительности все в точности наоборот.
С одной стороны, увеличивая связность внутри узла выше некоторого предела, мы автоматически снижаем связность между узлами (вряд ли 8-ядерный сервер будет оснащаться 8-ю адаптерами высокоскоростной коммуникационной сети для связи с себе подобными).
С другой стороны, как мы уже говорили выше, объединение нескольких процессоров на общей памяти приводит, вообще говоря, к замедлению работы каждого из процессоров по причине их конкуренции за доступ к памяти. Эффект максимально проявляется в SMP – системах. Таковыми являются все многопроцессорные серверы Intel (Pentium) и IBM (Power), а также все многоядерные процессоры (ядра в пределах одного процессора всегда конкурируют за память). Замедление может быть очень существенным (в 1.5, а то и почти в 2 раза), и сильно зависит от алгоритмической специфики задач и от транслятора.
Информация о работе Технологии высокопроизводительных вычислений