Історична перспектива
Справді неможливо сказати, якими будуть нові парадигми в майбутньому, наприклад, гарну історичну перспективу. Я пропоную прочитати « Підйом і падіння КНП Кена Кеннеді» . Кеннеді розповідає про дві нові моделі, MPI проти розумного компілятора, та детально описує, як MPI мав потрібну кількість ранніх прийнятих та гнучкість домінувати. HPF врешті-решт вирішив свої проблеми, але було вже пізно.
Багато в чому кілька парадигм, такі як PGAS і OpenMP, дотримуються цієї ж тенденції ВПЧ. Ранні коди були недостатньо гнучкими, щоб добре використовувати, і залишили багато продуктивності на столі. Але обіцянка не потрібно писати кожну йоту паралельного алгоритму - приваблива мета. Тож завжди переслідують нові моделі.
Чіткі тенденції в обладнанні
Зараз успіх MPI часто посилається на тісний зв'язок із тим, як він моделює апаратне забезпечення, на якому він працює. Приблизно кожен вузол має кілька процесів, і передача повідомлень у локальну точку-в-точку або через скоординовані колективні операції легко здійснюється в просторі кластера. Через це я не довіряю тому, хто надає парадигму, яка не слідкує за новими апаратними тенденціями, я фактично був переконаний у цій думці твором Вівака Саракара .
Відповідно до цього, тут є три тенденції, які чітко просуваються в нових архітектурах. І дозвольте мені бути зрозумілим, зараз є у HPC продається дванадцять різних архітектур. Це було менш ніж 5 років тому лише з x86, тому найближчі дні побачать безліч можливостей для використання апаратних засобів різними та цікавими способами
- Фішки спеціального призначення: Подумайте про великі векторні одиниці, як прискорювачі (перегляд Білла Далі з Nvidia)
- Чіпи малої потужності: кластери на основі ARM (для розміщення бюджетів на енергоспоживання)
- Плитка чіпсів: продумайте плитку чіпів з різними специфікаціями (робота 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 спільної пам'яті.
Як зазначає Метт, найбільшим підвищенням продуктивності для обчислювальних інтенсивних кодів є векторизація серійного коду. Хоча багато людей вважають, що це правда у прискорювачах, це також критично важливо і для машин на вузлі. Я вважаю, що у Вестмера є 4 широких FPU, тому можна отримати лише чверть флопів без векторизації.
Хоча я не бачу, як поточний OpenMP добре входить у цей простір, є місце для мікросхем з низьким джерелом живлення або плитки, щоб використовувати більше світлих ниток. OpenMP має труднощі описати, як працює потік даних, і в міру використання більшої кількості потоків я бачу, що ця тенденція стає все більш перебільшеною, просто перегляньте приклади того, що потрібно зробити, щоб отримати належне попереднє завантаження з OpenMP.
І OpenMP, і PThreads на достатньому рівні курсу можуть скористатись векторизацією, необхідною для отримання високого відсотка піку, але для цього потрібно розбити алгоритми таким чином, щоб векторизація була природною.
Копроцесор
Нарешті з'явилася поява спільного процесора (GPU, MIC, акселератори стільникових пристроїв). Стає зрозуміло, що жоден шлях до екскавалу не буде повним без них. У SC11 кожен учасник конкурсу Bell використовував їх дуже ефективно, щоб дістатись до низьких петафлопів. Поки CUDA та OpenCL домінували на поточному ринку, я сподіваюся на компілятори OpenACC та PGAS увійти в космос.
Тепер, щоб дістатись до екскавального масштабу, одна пропозиція - приєднати мікросхеми з низьким рівнем живлення до багатьох спільних процесорів. Це досить добре знищить середній шар поточного стеку та використовувати коди, які керують проблемами вирішення на головному мікросхемі та відміняють роботу спільних процесорів. Це означає, що для роботи коду досить ефективно людина повинна переосмислити алгоритми з точки зору ядер (або коделей), тобто безпаралельних фрагментів інструкцій рівня. Наскільки мені відомо, рішення цієї еволюції є досить широко відкритим.
Як це впливає на розробника програми
Тепер, щоб перейти до вашого питання. Якщо ви хочете захистити себе від насуваючих складних машин, то слід зробити кілька речей:
- Розробіть свої алгоритми для відповідності принаймні трьох рівнів паралельної ієрархії.
- Створіть свої алгоритми з точки зору ядер, які можна переміщувати між спадкоємністю.
- Розслабте свою потребу в будь-яких послідовних процесах, всі ці ефекти будуть відбуватися асинхронно, оскільки синхронне виконання просто неможливо.
Якщо ви хочете бути виконавцем сьогодні, MPI + CUDA / OpenCL досить хороший, але UPC потрапляє туди, тому не погана ідея займати кілька днів і вивчити це. OpenMP розпочинає роботу, але призводить до проблем, коли код потрібно буде відновити. PThreads вимагає повністю переписати код у його стиль. Що робить MPI + CUDA / OpenCL найкращою моделлю на даний момент.
Що тут не обговорюється
Хоча вся ця розмова про розгортання є приємною, щось не надто обговорене тут - це отримання даних про машини та їх вимкнення. Незважаючи на те, що в системах пам'яті було багато досягнень, ми не бачимо їх у товарному кластері (просто занадто дорого коштує). Тепер, коли обчислювальні дані, що займаються обробкою даних, стають великим фокусом всіх конференцій над обчислювальними технологіями, неминуче буде просуватися великий пропускний простір пам'яті.
Це призводить до іншої тенденції, яка може відбутися (якщо залучити право фінансувати агентства). Машини ставатимуть все більш спеціалізованими для необхідного виду обчислень. Ми вже бачимо, що "об'ємні дані" машини фінансуються NSF, але ці машини знаходяться на іншому шляху, ніж в Exascale Grand Challenge 2019.
Це стало довше, ніж очікувалося, запитуйте посилання, де вони вам потрібні в коментарях