Размышления о мощных компьютерах возникли на почве прочтения статьи о намерениях Китая к 2020 году построить вычислительную систему с вычислительной мощностью не менее 1 эксафлопс.
1 эксафлопс — это 10 в 18 степени операций.
Число 18 нулями операций с числами с плавающей запятой — много это или мало?
Сравним с ПК
Процессоры современных персональных компьютеров обладают, помимо тактовой частоты, такими параметрами как число ядер и архитектурной особенностью называемой суперскалярность.
Все эти три параметра влияют на предельную вычислительную способность.
С тактовой частотой все ясно. Чем она выше, тем быстрее все происходит внутри процессора. Многоядерность позволяет выполнять операции параллельно в разных ядрах процессора, т.е. более одной операции за такт. Суперскалярность в некоторых случаях также позволяет выполнять более одной операции, но в рамках одного ядра.
Пиковые показатели к примеру Intel i7 4770 с тактовой частотой 3,9 ГГц могут быть следующими : [4 ядра] x [32 операции с 32-битными числами за один такт] x [3,9 ГГц] = 499.2 Гфлопс.
1 * 1018 / 500 * 109 = 2 * 106
Т.е. суперкомпьютер, который собираются построить в Китае, примерно в 2 млн. раз будет более быстрым, чем Intel i7 доступный всем и каждому для дома.
От теории к практике
Значит ли это, что привычные нам задачи, решаемые на ПК, к примеру архивирование, сжатие видео-файла, обработка графики и т.п. можно будет решить в 2 млн. раз быстрее с помощью этого монстра?
Однозначно — нет.
Чтобы выжать близкие к теоретическим возможностям показатели обычные программы не годятся для работы на суперкомпьютере. Вероятнее всего, суперкомпьютер выполнит работу не намного быстрее, чем ваш ПК.
Почему? Для ответа на этот вопрос надо понимать как устроен СК.
СК представляет собой сеть из компьютеров. Чтобы увеличить скорость вычислений, нужно так спроектировать программу, чтобы вычисления можно было вести параллельно. И тут возникают различные сложности.
- Не всякие задачи можно решать, используя параллельные вычисления. И с этим ничего не поделаешь! Тут суперкомпьютер не сможет нам помочь принципиально.
- Огромное число уже существующих программ, математических библиотек, утилит написаны без учета архитектуры параллельных вычислений. Их необходимо переписывать и адаптировать для СК. Это большой труд многих программистов.
- Чтобы реализовывать 2 пункт, да и вообще писать программы для СК, нужна весьма высокая квалификация. Известно, что в любой сфере высококлассных специалистов немного.
Размышляя над последним пунктом, я пришел к идее, что необходимо более изящное конструктивное решение проблемы на уровне языка программирования. Что позволило бы менее классным специалистам писать код, потенциально способный использовать возможности СК.
Сейчас подход выглядит примерно так: разработчик размышляет разбивать ли ему задачу для вычисления параллельно или нет. Решает сколько будет этих параллельных потоков вычислений. Количество потоков определяет максимально возможное число потенциально задействованных ядер или юнитов кластера суперкомпьютера. Попутно приходится решать множество организационных вопросов. Организация таких вычислений сама по себе тоже «стóит» каких то вычислительных ресурсов, времени программиста и может быть сложна в отладке и тестировании.
К примеру, вы обрабатываете массив данных, проводя независимые вычисления для каждого из элементов. Можно организовать несколько потоков и выполнить обработку каждой доли элементов массива в своём потоке.
Программист создаст фиксированное число потоков, произведет кучу рутинных операций по организации вычислений. Нужно дождаться окончания работы всех потоков, чтобы передать управление дальше. В каждом подобном случае специалист будет решать — стоит ли «игра свеч»?
Язык программирования
Представьте себе, что на уровне базовых конструкций языка программирования можно было создавать своего рода многопоточные конвееры, где вы указываете — массив данных и алгоритм (некую функцию-обработчик).
Вся рутина по выбору числа задействованных юнитов (ядер, потоков), организации по распределению входных данных, сбору результатов ложилась бы на компилятор.
Это приведет к появлению архитектурно-независимого программирования. Когда одна и та же программа сможет выполнятся на обычном ПК и эффективно работать на СК. Возможно, потребуется лишь перекомпиляция кода.