Послідовні та паралельні світи
(http://www.eejournal.com/archives/articles/20170124-parallel-universe/).
Послідовні та паралельні світи.
Реальні виклики у світі комп’ютерів наступного покоління
http://www.eejournal.com/archives/articles/20170124-parallel-universe/
by Kevin Morris. Оглядач сайту eejournal Кевін Моріс про перспективи розвитку комп’ютерних архітектур.
Зараз склались два альтернативні види множин обчислень: світ послідовних обчислень – так усвідомлює алгоритми наш мозок, та світ паралельних обчислень – так, як насправді працює обчислювальна апаратура. Ці два світи завжди співіснують, але архітектура фон Неймана нас закриває від них. Так як наші процесорні архітектури основані на лічильниках команд, ми досі впевнені, що наші комп’ютери виконують лише по одній команді за раз.
Тому, коли ми пишемо свої програми – навіть мовою високого рівня, ми завжди маємо на увазі, що кожна подія мусить виконуватись у нашому алгоритмі слідом за попередньою подією. Як інженери-електронщики, ми розуміємо, що насправді ми маємо паралельне комп’ютерне залізо, яке призначене виконувати багато завдань одномоментно. Тому мусимо бути свідомими і організованими при розробці своїх алгоритмів.
Навіть коли почали освоювати мови опису апаратури, програма на такій мові сприймається як послідовність операторів. Хоча правило, що одна команда виконується в один проміжок часу, не діє при розробці апаратури. Як результат, VHDL та Verilog досі є мовами, які майже неможливо зрозуміти і використати на відміну від нормальних високорівневих мов програмування. І це насправді дуже погано. Якщо би програмісти писали програми мовами VHDL та Verilog так само вправно, як вони це роблять мовою C, то ПЛІС-и (або щось подібне) були б вже впроваджені набагато глибше у серйозні обчислення.
Поширення об’єктно-орієнтованого програмування (ООП) трохи розбило стіну між цими послідовним та паралельним світами. Саме по собі поняття об’єкта зі своїми власними методами і окремим простором даних, багато в чому не поєднується з ідеєю єдиного програмного потоку у процесорі, у якому одночасно виконується лише одна команда. Вважається, що об’єкти існують і обробляються у процесорі паралельно.
Компіляція об’єктно-орієнтованого коду вниз до якоїсь машинної програми, виконання якої моделюється так, начебто об’єкти виконуються паралельно, є великим досягненням об’єктно-орієнтованих компіляторів. Проте, ООП пробило дірку у бар’єрі між послідовним всесвітом – де ми історично реалізуємо алгоритми, що складені для процедурних моделей програмування – і паралельним всесвітом, де мільйони логічних вентилів перемикаються між двома логічними станами майже одночасно.
Тепер, однак, ми стикаємося з протилежною проблемою від об’єктно-орієнтованого програмування. Коли раніше ООП намагалося відобразити паралельні концепції у послідовне апаратне забезпечення, то тепер нам необхідно відображати алгоритми, які були задумані як послідовні, в дуже оптимізовані паралельні апаратні структури. Якщо ми зможемо зробити це, то можна буде взяти послідовний програмний код успадкованого програмного забезпечення і автоматично транслювати його в спеціалізоване апаратне обладнання.
Нагорода за такий успіх була б вражаючою – продуктивність обчислень зросла б у сотні разів і особливо – параметр продуктивність на ватт споживаної потужності, який не залежить від поліпшення базової технології напівпровідників.
Коли ми уявляємо собі алгоритм як набір команд, що виконуються послідовно, ми, як правило, ігноруємо можливості для розпаралелювання та конвеєризації. Це особливість людської свідомості – організувати якийсь складний процес як послідовність простих дій. І зовсім не виникає думки щось розпаралелити. Хіба що кухар випікає усі тістечка паралельно на одному деко.
І таке саме відношення до алгоритмів лягає на програмування. А розпаралелюючий компілятор часто не в змозі розпізнати, які прості дії можна виконати паралельно, а які – ні. Отже, перше завдання – це створення таких інструментів, які можуть автоматично перетворювати послідовні алгоритми в оптимізовані паралельні структури. Інструменти повинні бути в змозі з’ясувати залежності по даних і порядок операцій, з метою створити паралельну модель обчислень.
Існує також питання про вибір та використання обчислювальних ресурсів. Більше або менше ресурсів буде визначати об’єм і типи обчислень, які ми могли б розпаралелити, а також ефективність використання ресурсів.
У світі апаратних засобів ресурси не є нескінченними, тобто апаратний алгоритм може просто не вміститись. (На відміну від однопроцесорної системи, де алгоритм може виконуватись як послідовність мільярдів та трильйонів команд, – часові ресурси майже нескінченні). Якщо ми маємо операцію множення всередині циклу і цей цикл виконується один мільйон раз, це означає, що операції множення можна виконувати паралельно в апаратних блоках на нашому чипі. Але, напевно, це буде не мільйон блоків множення.
Наш новий інструмент повинен розуміти наявні ресурси при прийнятті рішення про ступінь паралельності реалізації алгоритму. Він повинен вибрати у даному випадку, наприклад, сто чи тисячу блоків множення. Крім того, ці ресурси, напевне, мають бути організовані як конвеєри з метою максимального їх завантаження та збільшення пропускної здатності. Звичайно, на додаток до пропускної спроможності, є також проблема латентної затримки.
Отже, поняття простої компіляції програми, як для прямої реалізації у машині фон Неймана, суттєво змінюється. Тепер, щоби скомпілювати застаріле (послідовне) програмне забезпечення для паралельної архітектури необхідно ретельно проаналізувати його, щоби виокремити інформацію про можливості паралельних обчислень, яка не була там явно задана. Причому простір можливих реалізацій такої програми експоненційно зростає зі збільшенням ступеня паралелізму. І це тільки те, що видно на поверхні проблеми. Розпаралелювання, яке розглядалось вище, стосується алгоритмів без умовних операторів. А алгоритми з умовними переходами значно важче аналізувати і розпаралелювати.
Сьогодні оптимізація апаратної реалізації послідовного програмного забезпечення є областю досліджень інструментів високорівневого синтезу. Технологія таких інструментів пройшла довгий шлях за останні три десятиліття. Але вона до цих пір є далекою від мети -автоматичної трансляції застарілих програмних застосунків у реконфігуровані гетерогенні обчислювальні машини, які включають в себе як процесори фон Неймана, так і альтернативні апаратні архітектури, такі як ПЛІС. Створення такого інструменту є неймовірно складною справою, воно спроможне революціонізувати обчислення. Будемо сподіватися, що нашим колегам, які вирішують цю проблему, дме у спини погожий вітер!