Які проміжні уявлення можна використати для міркування про одночасність?


12

Я намагаюся краще зрозуміти, що потрібно, щоб компілятор міг зробити інтелектуальний вибір щодо одночасності від імені програміста. Я розумію, що існує багато складних аспектів цієї проблеми, наприклад:

  • Забезпечення відсутності перегонових умов
  • Забезпечення одночасного запуску коду не матиме побічних ефектів, що впливають на смислове значення коду

  • Вирішити, чи варто накладні витрати на прядіння ниток, враховуючи ступінь паралельності, наявного в коді

Я розумію, що два основних проміжних представлення, які використовуються в сучасних компіляторах, є статичним єдиним призначенням для процедурних та об'єктно-орієнтованих мов та стилем продовження передачі функціональних мов. Розібратися з будь-якою з перерахованих вище проблем видається за допомогою цих проміжних форм важко. Навіть мови, які теоретично повинні мати найкращі шанси при автоматичній паралелізації (чисті функціональні мови, такі як Haskell з гарантією відсутності побічних ефектів), досягли обмеженого прогресу на цьому фронті.

Отже, моє запитання справді те, які проміжні уявлення використовувались для того, щоб спробувати вирішити цю проблему? Чи є інші уявлення, які були використані в академічних дослідженнях, про які я не знаю, які краще підходять до цього завдання? Чи є ця проблема тією, яку принципово доводиться вирішувати переднім кінцем компілятора, маніпулюючи абстрактним синтаксичним деревом, перш ніж компіляція досягне проміжного представлення?


Якщо ви пишете свій код функціонально, вам не доведеться турбуватися про перегони або про побічні ефекти.
Роберт Харві

4
Це не зовсім відповідає вашому запитанню, але вас може зацікавити Process Calculi, який може бути використаний для міркування про паралельний код. Найвідомішим прикладом може бути обчислення Пі . Однак автоматична паралелізація все ще залишається невирішеною проблемою, і її найкраще вирішувати, розробляючи мови спеціально для надання компілятору певних гарантій або використовуючи спеціальні анотації.
амон

4
У статті, яка служить фоном для Intel Concurrent Collections (CnC), перелічено вісім основних паралельних моделей, таких як «Виробник-споживач». Ці паралельні закономірності в свою чергу залежать від ряду властивостей, таких як незмінність і відсутність побічних ефектів. (Буду вдячний, якщо хтось може узагальнити цей документ і опублікувати як відповідь тут.)
rwong

Один з теоретичних інструментів називається "Динамічне єдине призначення (DSA)", побудований поверх SSA.
rwong

@rwong: чи можете ви надати чітку посилання?
Іра Бакстер

Відповіді:


5

Можна припустити, що моделювання одночасності в явному проміжному поданні (ІР) було необхідною вимогою. Таким чином, одна відповідь буде: "будь-який ІР, що використовується для послідовних програм з додаванням деяких операцій одночасності", наприклад, "вилка та з'єднання", "паралельна х у". Додавання цих даних дозволяє міркувати про деякі види одночасності, але не обов'язково легко. Також не очевидно, як забезпечити певні властивості (свободу перегонів даних), не йдучи до повного функціонального подання (що ускладнює корисність моделювання паралелізму).

Можливо кольорові мережі Петрі (CPN) - хороший вибір для представлення програм з одночасністю. (Токени в CPN "кольорові" [мають тип] і можуть нести значення; "переходи" в стани можуть виконувати довільну арифметику на вхідних жетонах для отримання можливого різного кольору токена з обчисленим значенням у "місці"). Якщо ви думаєте про місця, які обчислюють результати та переходи як оператори моделювання (включаючи спеціальний для доступу до пам'яті), це дає вам значення, що становить графік потоку даних, за допомогою якого моделювати програми. Ви можете легко скористатися цим, щоб дати формальну інтерпретацію класичним представникам компілятора, таким як трійки [оператор, введення1, вхід2, вихід].

Існує безліч інструментів для аналізу таких графіків CPN, включаючи обчислювальні властивості, такі як безвідома можливість, обмеженість підрахунку токенів місцями тощо. Герархічні CPN дозволяють моделювати функції та процедури та поняття "дзвінки".

Те, що ці представлення чітко не роблять, - це легко міркувати про те, де можна було б паралелізувати додаток. Тривіально, дві підрахунки можуть бути паралельними, якщо вони не мають спільних операндів (саме тому деякі люди люблять функціональні програми / уявлення). Якщо ваше програмне представлення моделює спільну пам'ять, ви можете моделювати її як моноліт і отримувати звичайний набір проблем щодо міркувань про взаємодію спільної пам'яті, включаючи псевдонімна адресація тощо. Одним із способів уникнути цього є трактування пам'яті як ізольованих фрагментів більший стан програми - це деяка (деревоподібна) збірка з них; Ви можете, безперечно, передавати ці шматки навколо у своєму проміжному поданні. Немає взаємодії між двома паралельними обчисленнями, якщо вони не ділять фрагменти (наприклад, підтрубки пам'яті).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.