Историческая перспектива
На самом деле невозможно сказать, какими будут новые парадигмы в будущем, например, хорошая историческая перспектива, которую я предлагаю прочитать в книге Кена Кеннеди « Подъем и падение ФВЧ» . Кеннеди рассказывает о двух новых моделях, MPI и интеллектуальном компиляторе, и рассказывает о том, как у MPI было достаточно ранних пользователей и гибкости, чтобы доминировать. HPF в конце концов исправила свои проблемы, но было слишком поздно.
Во многих отношениях несколько парадигм, таких как PGAS и OpenMP, следуют той же тенденции HPF. Ранние коды не были достаточно гибкими, чтобы хорошо их использовать, и оставляли много производительности на столе. Но обещание не писать каждую йоту параллельного алгоритма является привлекательной целью. Поэтому стремление к новым моделям всегда преследуется.
Четкие тенденции в оборудовании
В настоящее время успех MPI часто упоминается как тесно связанный с тем, как он моделирует оборудование, на котором он работает. Примерно в каждом узле есть несколько процессов, и передача сообщений в локальные двухточечные или посредством согласованных коллективных операций легко выполняется в пространстве кластера. Из-за этого я не доверяю никому, кто дает парадигму, которая не очень внимательно следит за новыми тенденциями в оборудовании, на самом деле я был убежден в этом мнении работой Vivak Sarakar .
В соответствии с этим здесь есть три тенденции, которые явно продвигаются в новых архитектурах. И позвольте мне прояснить, что сейчас в HPC продается двенадцать различных архитектур. Это меньше, чем 5 лет назад только с x86, поэтому в ближайшие дни появится много возможностей для использования аппаратного обеспечения различными и интересными способами.
- Чипы специального назначения: представьте себе большие векторные блоки как ускорители (см. Билла Дэлли из Nvidia)
- Чипы с низким энергопотреблением: кластеры на основе ARM (для учета энергопотребления)
- Tiling of Chips: подумайте о фишках с разными спецификациями (работа Avant Argwal )
Текущие Модели
Текущая модель на самом деле 3 уровня. Хотя существует много кодов, которые хорошо используют два из этих уровней, немногие появились с использованием всех трех. Я считаю, что для того, чтобы сначала перейти к расширению, нужно вложить средства в определение того, может ли ваш код работать на всех трех уровнях. Это, пожалуй, самый безопасный путь для повторения с современными тенденциями.
Позвольте мне повторить модели и то, как они должны будут измениться, основываясь на предсказанных новых видах оборудования.
распределенный
Игроки на распределенном уровне в основном относятся к языкам MPI и PGAS. MPI сейчас является явным победителем, но языки PGAS, такие как UPC и Chapel, продвигаются вперед. Хорошим показателем является тест HPC Benchmark Challenge. Языки PGAS предоставляют очень элегантные реализации тестов.
Наиболее интересным моментом здесь является то, что, хотя эта модель в настоящее время работает только на уровне узлов, она будет важной моделью внутри узла для плиточных архитектур. Одним из признаков является чип Intel SCC, который в основном действовал как распределенная система. Команда SCC создала собственную реализацию MPI, и многим командам удалось перенести библиотеки сообществ на эту архитектуру.
Но, честно говоря, у PGAS действительно хорошая история для того, чтобы вступить в это пространство. Вы действительно хотите запрограммировать междоузлий MPI, а затем сделать тот же трюк интранода? Одна из больших проблем с этими плиточными архитектурами заключается в том, что они будут иметь разную тактовую частоту на чипах и существенные различия в пропускной способности памяти, поэтому производительные коды должны учитывать это.
Совместная память на узле
Здесь мы видим, что MPI часто «достаточно хорош», но PThreads (и библиотеки, основанные на PThreads, такие как Intel Parallel Building Blocks) и OpenMP по-прежнему используются часто. Распространенное мнение состоит в том, что будет время, когда будет достаточно потоков совместно используемой памяти, чтобы модель сокета MPI сломалась для RPC, или вам понадобится более легкий процесс, выполняющийся на ядре. Уже вы можете видеть признаки того, что системы IBM Bluegene имеют проблемы с MPI с общей памятью.
Как комментирует Мэтт, наибольший прирост производительности для ресурсоемких кодов - это векторизация последовательного кода. Хотя многие полагают, что это верно для ускорителей, это также важно для машин на узлах. Я считаю, что Westmere имеет FPU шириной 4, поэтому без векторизации можно получить только четверть флопов.
Хотя я не вижу, чтобы текущий OpenMP вошел в это пространство, есть место для микросхем с низким энергопотреблением или для тайлов, чтобы использовать больше легких потоков. OpenMP испытывает трудности с описанием того, как работает поток данных, и с увеличением количества потоков я вижу, что эта тенденция становится все более преувеличенной, просто посмотрите на примеры того, что нужно сделать, чтобы получить правильную предварительную выборку с OpenMP.
И OpenMP, и PThreads на уровне, достаточном для курса, могут использовать векторизацию, необходимую для получения хорошего процента пика, но для этого необходимо разбить ваши алгоритмы так, чтобы векторизация была естественной.
Со-процессор
Наконец, появление сопроцессора (GPU, MIC, Cell Acclerator) вступило в силу. Становится ясно, что ни один путь к exascale не будет полным без них. На SC11 каждый участник конкурса Белл использовал их очень эффективно, чтобы добраться до низких петафлопов. Хотя CUDA и OpenCL доминируют на текущем рынке, я надеюсь, что компиляторы OpenACC и PGAS выйдут в космос.
Теперь, чтобы перейти к расширению, одно из предложений - соединить маломощные чипы с множеством сопроцессоров. Это очень хорошо убьет средний уровень текущего стека и будет использовать коды, которые решают проблемы с решением на главном чипе и перекладывают работу на сопроцессоры. Это означает, что для того, чтобы код работал достаточно эффективно, человек должен переосмыслить алгоритмы в терминах ядер (или кодлетов), то есть параллельных фрагментов уровня команд без ветвей. Насколько я знаю, решение этой эволюции довольно широко открыто.
Как это влияет на разработчика приложения
Теперь перейдем к вашему вопросу. Если вы хотите защитить себя от встречных сложностей машин exascale, вы должны сделать несколько вещей:
- Разработайте свои алгоритмы, чтобы соответствовать как минимум трем уровням параллельной иерархии.
- Разработайте свои алгоритмы в терминах ядер, которые можно перемещать между иерархиями.
- Ослабьте вашу потребность в любых последовательных процессах, все эти эффекты будут происходить асинхронно, потому что синхронное выполнение просто невозможно.
Если вы хотите быть эффективными сегодня, MPI + CUDA / OpenCL достаточно хорош, но UPC добивается успеха, поэтому неплохо было бы потратить несколько дней и изучить его. OpenMP помогает вам начать работу, но приводит к проблемам, когда код нуждается в рефакторинге. PThreads требует полностью переписать ваш код в соответствии со своим стилем. Что делает MPI + CUDA / OpenCL текущей лучшей моделью.
Что здесь не обсуждается
Хотя все эти разговоры об exascale хороши, кое-что, на самом деле не обсуждаемое здесь, - это передача данных на машины и обратно. Хотя было много достижений в системах памяти, мы не видим их в товарном кластере (просто слишком дорого). Теперь, когда ресурсоемкие вычисления становятся центром внимания всех суперкомпьютерных конференций, в область с высокой пропускной способностью памяти наверняка придет большее движение.
Это приводит к другой тенденции, которая может произойти (если вовлечь правильные финансирующие агентства). Машины будут становиться все более и более специализированными для требуемого типа вычислений. Мы уже видим, что «ресурсоемкие» машины финансируются NSF, но эти машины находятся на другой трассе, чем Exascale Grand Challenge 2019 года.
Это стало длиннее, чем ожидалось, попросите ссылки, где они вам нужны в комментариях