Original: http://www.isi.edu/~pedro/CA/commutativity.html
Pезюме
Паралельні машини пропонують обіцянку значного збільшення продуктивності, дозволяючи кілька процесорів одночасно виконувати різні частини обчислень. Програмісти традиційно розроблені програми для паралельних машин з використанням явно паралельних мов. На відміну від серійних мов програмування, явно паралельні мови являють собою складну модель програмування, яка характеризується такими явищами, як глухий кут, недетермінірованного виконання і, передачі повідомлень машин, необхідність безпосередньо управляти переміщенням даних за допомогою обчислень. Очевидні переваги програмування послідовного програмування імперативного парадигми є тому надихнули розвиток методів аналізу і компіляторів, призначених для автоматичного розпаралелювання послідовних програм.
Сучасні компілятори распараллелівать зберігають семантику оригінального послідовної програми шляхом збереження залежностей даних. Ці компілятори намагаються ідентифікувати незалежні частини розрахунку (дві частини обчислення незалежні, якщо жоден з них не пише частина даних про те, що інші доступи), а потім генерувати код, який виконує незалежні частини одночасно. Істотним недоліком цього підходу є складність проведення аналізу залежність, яка є досить точним, щоб виставити значну кількість паралельності. У той час як дослідники змогли розробити досить ефективні алгоритми для вкладеності циклів, які маніпулюють щільних матриць з використанням афінних функцій доступу, спостерігається незначний прогрес в напрямку успішного автоматичного аналізу програм, що маніпулюють покажчиків на основі структури даних. Дослідники спробували побудувати повністю автоматичні системи, але найбільш перспективні підходи вимагають від програміста, щоб забезпечити анотації, які визначають інформацію про глобальну топології оброблюваних структур даних. Другий, більш фундаментальне обмеження підходів, заснованих на даних залежність є неможливість распараллелить обчислення, які маніпулюють граф-подібні структури даних. Аліаси за своєю суттю, присутні в цих структурах даних виключає статичну виявлення незалежних частин коду, змушуючи компілятор генерувати серійний код. І, нарешті, збереження залежності даних для програм, які періодично оновлювати спільні структури даних можуть штучно обмежити кількість виставленої паралелізму, оскільки завдання повинні затримати поновлення, поки вони не впевнені, що кожне оновлення не змінить відносний порядок читання та запису в загальній структурі даних.
Аналіз перестановки є статичний каркас аналіз для виявлення комутуючих операцій. Дві операції коммутируют, коли вони виробляють той же результат, незалежно від порядку, в якому вони виконуються. Аналіз перестановочность усуває багато обмежень існуючих підходів, заснованих даних залежність Замість збереження відносний порядок індивідуального читання і запису окремих слів пам’яті, аналіз коммутативности агрегує дані і обчислення в більші одиниці зерна. Потім він статично аналізує обчислення в цьому зернистості, щоб виявити, коли шматки обчислення коммутируют тобто генерують той же результат, незалежно від порядку, в якому вони виконуються. Якщо всі операції, необхідні для виконання даного обчислення коммутируют, компілятор може автоматично генерувати паралельний код. У той час як в результаті паралельної програми може привести до порушення залежності даних вихідної послідовної програми, він як і раніше гарантовано генерувати той же результат.
Цей підхід має кілька цікавих властивостей. Оскільки аналіз коммутативности не спирається на інформацію про топології маніпулюють структур даних, компілятор, який використовує аналіз коммутативности не потрібно аналізувати частини коду, які будують структуру даних. аналіз перестановочность тому підходить для неповних обчислень, таких як додатки, які маніпулюють постійні дані (наприклад, об’єктно-орієнтованих додатків для баз даних) і додатків, які маніпулюють географічно розподілених даних (наприклад, мобільні обчислення в World Wide Web). У цих випадках, код, який спочатку побудував структуру даних можуть бути недоступні або більше не існує. Аналіз перестановки також особливо підходить для обчислень, які маніпулюють графіки. Це дуже важливий аспект аналізу коммутативности, оскільки обчислення, які керують ці структури даних за своєю природою поза досяжністю аналізу залежностей за даними.
Ми взяли системний підхід, орієнтований на оцінку здатності аналізу коммутативности витягувати і експлуатувати значну кількість паралелізму в повних додатків. Ми побудували розпаралелювання компілятор, який використовує аналіз коммутативности в якості основної парадигми аналізу. Цей компілятор приймає в якості вхідних даних в Неаннотірованний послідовну програму, написану в підмножині C ++ і генерує паралельний код для багатопроцесорної розділяється пам’яті. Використовуючи цей розпаралелювання компілятор, ми автоматично распараллелить кілька додатків, в тому числі N-тіла решателя Barnes-Hut, рідкого коду моделювання води, і код сейсмічного моделювання. Для всіх цих додатків, аналіз коммутативности здатний виставити значну кількість паралельності і згенерованого паралельного коду демонструє дуже хорошу продуктивність. На 16 процесорів, автоматично распараллелен версія Barnes-Hut працює від 11 до 12 разів швидше, ніж оригінальна версія послідовної; для застосування моделювання води, автоматично распараллелен версія працює від 7 до 8 разів швидше, ніж оригінальна версія послідовної; для застосування сейсмічного моделювання, автоматично распараллелен версія працює приблизно в 12 разів швидше, ніж оригінальний послідовної версії.
Ці експериментальні результати є вельми обнадійливими. Ці програми дуже динамічний характер – вони або маніпулювати складними покажчиками на основі структури даних або мають дуже нерегулярні доступу до даних. Експлуатуючи паралелізм крупнозернистий в додатках до цих характеристик була визнана дуже важкої проблеми. Ми не знаємо будь-якої іншої компілятор або компіляції техніки здатний видобувати значно більші кількості паралелізму для цих обчислень. Крім того, позитивні експериментальні результати забезпечують конкретні докази практичної значущості аналізу коммутативности як методу автоматичного розпаралелювання компіляторів