Высокопроизводительные вычисления

Высокопроизводительные вычисления [¹]

В конце 1990-х годов все еще оставался вопрос, смогут ли большие векторные суперкомпьютеры с их специализированными системами памяти противостоять атаке со стороны увеличивающихся тактовых частот микропроцессоров. Кроме того, в конце 1990-х годов возник вопрос, смогут ли быстрые, дорогие и энергоемкие RISC-архитектуры победить массовые микропроцессоры Intel и массовые технологии памяти.

К 2006 году архитектура Intel устранила все процессоры архитектуры RISC, значительно увеличив тактовую частоту и по-настоящему выиграв все более важное соревнование «Число операций с плавающей запятой на ватт». Как только пользователи выяснили, как эффективно использовать слабосвязанные процессоры, низкая общая стоимость и пониженное энергопотребление обычных микропроцессоров стали преобладающими факторами на рынке.

За последнее десятилетие определение того, что называют высокопроизводительными вычислениями, резко изменилось. В 1988 году персональный компьютер стоимостью 3000 долларов мог выполнять 0,25 миллиона операций с плавающей запятой в секунду, рабочая станция стоимостью 20 000 долларов могла выполнять 3 миллиона операций с плавающей запятой, а суперкомпьютер стоимостью 3 миллиона долларов мог выполнять 100 миллионов операций с плавающей запятой в секунду. Следовательно, почему бы нам просто не соединить вместе 400 персональных компьютеров, чтобы достичь производительности суперкомпьютера за 1,2 миллиона долларов?

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

Несмотря на то, что каждый процессор является мощным и небольшое количество процессоров можно разместить в одном корпусе, часто будут приложения, которые настолько велики, что им потребуется охватить несколько корпусов. Чтобы совместно решать более обширные задачи, эти корпуса соединены с высокоскоростной сетью, чтобы функционировать как сеть рабочих станций (СЕЙЧАС). NOW можно использовать индивидуально через пакетную систему очередей или как большой мультикомпьютер с помощью инструмента передачи сообщений, такого как параллельная виртуальная машина (PVM) или интерфейс передачи сообщений (MPI).

Некоторые примеры параллелизма в порядке увеличения размера зерна:

  • При выполнении сложения 32-битных целых чисел, используя сумматор с упреждающим переносом, вы можете частично добавить биты 0 и 1 одновременно с битами 2 и 3.
  • На конвейерном процессоре при декодировании одной инструкции вы можете получить следующую инструкцию.
  • На двустороннем суперскалярном процессоре вы можете выполнить любую комбинацию целого числа и инструкции с плавающей запятой за один цикл.
  • В мультипроцессоре вы можете разделить итерации цикла между четырьмя процессорами системы.
  • Вы можете разделить обширный массив на четыре рабочие станции, подключенные к сети. Каждая рабочая станция может работать со своей локальной информацией, а затем обмениваться граничными значениями в конце каждого временного шага.

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

[1] - Часть этого контента доступна по адресу: https://cnx.org/contents/10pAFv4r@3/

Совместная память и распределенная память

Общая память

А теперь представьте, что вы пытаетесь собрать все части очень большого пазла самостоятельно. Это, несомненно, займет у вас часы, особенно если вы впервые решаете загадку.

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

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

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

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

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

В компьютерной архитектуре общая память может выглядеть примерно так:

Рабочие будут центральными процессорами (ЦП), а таблица - памятью. В этом контексте все процессоры имеют общий доступ к памяти.

Распределенная память

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

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

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

В компьютерной сетевой среде это будет выглядеть примерно так:

Когда команда хочет общаться друг с другом, она отправляет сообщение по сети.

Что такое MPI?

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

  • Больше: больше памяти
  • Быстрее: каждый процессор быстрее
  • Еще: выполняйте много вычислений одновременно

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

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

Если передача сообщений - это просто отправка и получение сообщений между компьютерами, тогда зачем нам использовать MPI?

Почему MPI?

Это просто звучит как сетевое взаимодействие, и уже существуют десятки библиотек для обработки таких вещей, зачем нам еще одна. Во-первых, интерфейс MPI разработан и реализован с учетом производительности. Во-вторых, интерфейс MPI будет использовать самый быстрый доступный ему сетевой транспорт при отправке сообщений. Так, например, для связи с двумя разными процессами внутри узла MPI будет использовать общую память (внутри компьютера) для отправки и получения сообщений, а не для сетевых коммуникаций. В случае быстрых межсоединений внутри высокопроизводительного компьютерного кластера он уже знает, как использовать преимущества транспорта, такого как Infiniband или Myrinet, для связи с процессами на других узлах, а в случае сбоя всего остального он будет использовать стандартный Internet TCP / IP. Это огромный массив сетевого кода для множества интерфейсов и протоколов, который вам не нужно реализовывать самостоятельно :)

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

Трансляция (один-ко-многим)

Часто бывает полезно транслировать данные, которые представляют собой операцию "один ко многим". Один процесс имеет фрагмент данных и передает его многим или всем другим процессам.

Scatter (один ко многим)

Близким родственником широковещательной передачи является Scatter, где один процесс делит значения между многими другими.

Собери (многие к одному)

Обратное к Scatter - это Gather. В котором многие процессы имеют разные части общей картины, которые затем объединяются в один процесс.

Сокращение (один ко многим)

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

MPI - высокий или низкий уровень?

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

Низкий уровень для ученых:

  • использование MPI означает, что мы должны выяснить, как разделить проблему между несколькими компьютерами (декомпозиция) и
  • написать код для каждого взаимодействия, которое должно происходить между ними (вручную писать код для каждого взаимодействия)

Так стоит ли нам использовать MPI для всего?

No

Вероятно, это лучший выбор для выполнения одного большого вычисления на аналогичных машинах в надежной сети, например, на нескольких рабочих столах в лаборатории или в специализированном компьютерном кластере, но было бы кошмаром пытаться использовать для написания распределенной клиент чата или BitTorrent Network, если это возможно. Подходы с передачей сообщений могут очень хорошо работать для таких систем. Erlang - это пример языка программирования, использующего передачу сообщений, который очень хорош для такого рода задач, а MPI - нет. MPI не предназначен для обработки возникающей сложности, связанной с постоянным подключением и отключением клиентов от сети. С другой стороны, если у вас много независимых вычислений, и вы просто хотите разделить их для параллельного выполнения в качестве фермы задач, MPI может работать для этого, но это довольно важный инструмент для использования для довольно простой задачи. Могут быть другие подходы, которые проще.

Я надеюсь, что благодаря этому вы смогли получить общее представление о MPI :)

Давайте скоро встретимся со следующей частью этого блога «Как работать с MPI?» А пока хорошо проводите время😃

Особая благодарность: г-жа М.А. Каляни (преподаватель - факультет компьютерных наук, Университет Рухуна, Шри-Ланка)