Практичне застосування розмальовки графів

Розмальовка графів практично застосовується (постановка завдання різних розмальовок тут не обговорюватиметься) для:

Зміст

  • розклади для освітніх установ (огляд - [1] );
  • розклади у спорті (огляд - [2] );
  • планування зустрічей, зборів, інтерв'ю;
  • розклад транспорту, в тому числі - авіатранспорту [3] ;
  • розклади для комунальних служб [4];
  • та інші.

Мабуть, будь-якому конкретному виду забарвлення знайдеться застосування у складанні розкладів.

Помітну роль швидкодії програм на комп'ютері грає час звернення мікропроцесора до даних. А саме, процесор може звертатися (перерахуємо пристрої в порядку зменшення швидкодії та збільшення обсягу) до:

Далі, розглянемо оптимізації програм, пов'язані з розподілом даних у цих пристроях.

Стандартний підхід Хайтіна

Першими [5] важливими роботами, що заклали основи застосування методу розмальовки графів у розподілі регістрів, були [6] , [7] — наступні ж не додали нічого революційного, увага була сконцентрована на прискоренні роботи алгоритму, зменшенні пам'яті, нових евристиках за визначенням вартості відкачування регістрів (введемо визначення далі) та вибору регістрів для відкачування; огляд цих методів можна знайти в [8].

Далі, розглянемо спосіб, запропонований у [7].

Розподіл регістрів (англ. register allocation) мікропроцесора зазвичай проводиться на етапі компіляції.

На вхід процедури розподілу подається якийсь внутрішній код (IL, intermediate language, internal language), який розрахований на віртуальну машину з необмеженим числом регістрів - називатимемо їх віртуальними регістрами.

Наприклад, кількість регістрів загальногопризначення переважно процесорів Intel, відповідних архітектурі:

(Однак, навіть не всі з них можуть бути використані в нашій процедурі розподілу регістрів, оскільки вже можуть бути зайняті — але це вже тонкі питання реалізації.) Оперативна пам'ять може зберігати дуже велику кількість «відкачаних» «регістрів» — обмеження на її обсяг розглядати не будемо.

Перед виконанням самої процедури розподілу варто зробити:

  • Оптимізацію звернень до віртуальних регістрів.
  • Визначення того, чи є змінна на даний момент «значною» для кожного місця програми. «Значима» змінна тоді, коли далі у програмі відбувається читання записаного у ній на даний момент значення.

Сам алгоритм розподілу регістрів складається з наступних кроків:

  • Побудова графа - назвемо його графом несумісностей (interfernce graph, conflict graph). Вершини цього графа - регістри. Вершини суміжні, якщо відповідні змінні «значущі» одночасно (по-іншому: одна із змінних визначена тоді, коли інша вже «значима»).
  • «Склеювання» змінних (subsumption, variable propagation): якщо до копіювання однієї змінної в іншу, 2-а ще не «значима», а 1-а не «значима» після копіювання — ми можемо опустити непотрібну операцію переміщення і стягнути («склеїти» ») відповідні даним змінним вузли графа.
  • І, нарешті, найцікавіший для нас етап: знаходження n-розмальовки графа, де n — кількість вищезгаданих реальних змінних. Розв'язанням цього завдання розмальовки є оптимальне розподіл регістрів. Розфарбовуватимемо так:
  1. Для вершин зі ступенем меншим за n — призначимо колір, якщо можна.
  2. Для нерозфарбованих вершин (або їх ступінь не менше n, або кольорузакінчилися) - «відкачуємо» змінні; видаляємо ці вершини із графа. Відповідно, у сусідніх їм вершин ступінь зменшується - і має сенс знову зробити крок 1. (Не варто забувати, що при відкачуванні також можливе введення нової змінної - її треба додати до графа.)

Практика показує, що алгоритм сходиться досить швидко.

Розмальовка графа застосовується у багатьох відомих компіляторах, наприклад:

  • У GCC версії 4.4 з'явився новий розподільник регістрів [www 2] - англ. integrated register allocator, який застосовує т.з. забарвлення «Хайтіна-Бріггса».
  • Розмальовка "Хайтіна-Бріггса" застосовується і в (принаймні, його ранніх версіях) компіляторі від Intel для архітектури IA-64. [www 1][9]

Облік паралелізму лише на рівні команд

Процесори, здатні одночасно і незалежно виконувати кілька команд, знаходять все ширше застосування; про них кажуть, що підтримують паралелізм лише на рівні команд (англ. Instruction-level parallelism , ILP ). Назвемо їх ILP-процесорами. Клас ILP-процесорів включає у тому числі процесори з дуже довгим командним словом - VLIW (Very Large Instruction Word, до яких належать, зокрема, багато моделей цифрових процесорів обробки сигналів (ЦПОС). Найвідомішою комерційно успішною реалізацією концепції паралелізму на рівні окремих Інструкцією є сімейство мікропроцесорів Itanium компанії Intel, також варто відзначити архітектуру E2K, розроблену українською компанією МЦСТ.

Для реального використання високої продуктивності ILP-процесорів необхідні компілятори високого рівня мов, здатні генерувати ефективний код; у тому числі, важлива та оптимізація розподілу регістрів. Введення ILP вимагає серйозної переробки методуХайтіна у частині побудови графа несумісності; в [5] запропоновано доопрацьований варіант.

Розподіл коду, що виконується по кешу

Було запропоновано також алгоритм для розподілу часто використовуваних областей коду в кеші [10] — т. зв. англ. cache line coloring.

Граф несумісності тут такий: вершини — деякі блоки коду (можна, наприклад, брати процедури), ребра існують тоді, коли з одного блоку викликається інший. Як видно, ми концентруємось на т.з. конфліктах першого покоління (first-generation cache conflicts) — між «блоком» та її викликаючим/викликаним. Але варто зазначити, що завдання розмальовки вирішується не алгоритмами загального призначення, а спеціальним евристичним, який, до того ж, дає рішення, яке задовольняє додаткові умови.

Достоїнство цього методу в тому, що враховуються і розміри кешу, рядки кешу, блоків коду, і асоціативність кешу. Метод вдало комбінується з іншими оптимізаціями та inline-функціями [10] [11] . Слід зазначити, що може реалізовуватися оптимізатором — але з оптимізатором компілятора, а оптимізатором компоновщика.

Хорошою роботою, що класифікує такі завдання та систематично викладає їх рішення, є [12] .

Термін «розподіл частот» поєднує різні типи завдань, які часто мають різні цілі та моделі. Ці завдання включають:

  • Планування моделей розподілу (ліцензування, регулювання) радіочастот, що максимізують використання всього радіоспектру.
  • Врахування того, що треба відвести діапазони і для мобільного, наземного (англ. point-to-point) і супутникового зв'язку, радіо- і телетрансляцій.
  • Алгоритми, що динамічно розподіляють частоти однієї конкретної мережі між користувачами. Особливо цікавий тут стільниковий зв'язок,в області якої виконано дуже великий обсяг досліджень.

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

Два основні напрями оптимізації тут:

  • максимізація пропускної спроможності каналів за збереження певного мінімального рівня інтерференції (перешкод);
  • мінімізація інтерференції задля досягнення фіксованої пропускної спроможності.

У ході розгляду відповідних моделей, у [12] виникають завдання не набагато складніше T-розмальовки (англ. T-coloring) мультиграфа, спискового T-розмальовки (англ. set T-coloring).

Як приклад роботи над реальною стільниковою мережею, результати якої були далі застосовані оператором у своїй практичній діяльності - [13] (Проведено оператором E-Plus (англ. en:E-Plus) - 3-м за величиною в Німеччині (на 2010 рік) )).

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

Наведемо такі приклади чисельних методів, які можна розпаралелити:

Розкладання Холецького для методу сполучених градієнтів із приреченням

[14] Цей метод є одним із кращих ітераційних методів для вирішення систем лінійних рівнянь алгебри (СЛАУ) з великими, розрідженими, симетричними, позитивно визначеними матрицями.

Метод Зейделя у застосуванні до розріджених матриць

Теж ітераційний метод вирішення СЛАУ.

Цей, у свою чергу, хороший, наприклад, для розрахунку енергорозподільчих електромереж: такі мережі можуть бути представлені графами, вершини яких це споживачі та джерела електроенергії, а ребра лінії електропередач; далі, будується СЛАУ, у матриці якої діагональним елементам відповідають вузли вищезгаданого графа, а ненульовим недіагональним - ребра. [15]

Також, метод може бути т.зв. згладжувачем (англ. iterative smoother) для багатосіточних методів вирішення задач методом кінцевих елементів. (англ. Multigrid методів finite element problems). Оптимізація методу Зейделя, що використовується у згладжуванні, за допомогою т.з. англ. sparse tiling для такого випадку його використання розглянуто у [16] .

Методи з використанням адаптивно уточнюваної сітки

[17] Вони, своєю чергою, корисні у вирішенні диференціальних рівнянь у приватних похідних (ДУЧП). Принцип уточнення тут такий: у місцях, де очікується найбільша локальна похибка, де рішення змінюється найшвидше, щільність сітки вибирається більшою.

Метод координатної релаксації

(англ. Method of coordinate relaxation)

[18] Вдало застосовується у знаходженні екстремальних власних значень дуже великих розріджених симетричних матриць. Іноді таких великих, що їх практичніше генерувати на льоту, ніж зберігати у пам'яті. Такі завдання часто постають у квантовій механіці.

Призначення неповним LU-розкладанням

Для простого випадку, коли «ущільнення» похідної обмежується зменшенням кількості стовпців, наведемо алгоритм:

Вхід: функція від вектора - F

Місце розмальовки графа тут - у обчисленні S . У найпростіших випадках треба обчислюватизвичайну вершинну (англ. distance-1); distance-2 забарвлення (яке, в тому числі зводиться до distance-1 забарвлення square graph); більш складних, потрібні невеликі додаткові обмеження:

  • зоряна розмальовка (star coloring) - вершинна distance-1, але з додатковим обмеженням: для будь-якого шляху з 4-х вершин використовується не менше 3-х кольорів;
  • ациклічна розмальовка (acyclic coloring) - вершинна distance-1 + кожен цикл використовує не менше 3-х кольорів.

У рамках вищезгаданого проекту було проведено обчислення для технічних виробничих завдань:

  • процес хромотографічного поділу (з галузі хімії, хімічної технології) за допомогою техніки англ. Simulated Moving Bed;
  • вирішення задачі оптимального енергетичного потоку (optimal power flow) (електроенергетика).

Це важливо, наприклад, для встановлення джерела їхнього поширення нелегальним чином. Або для підтвердження прав на дані, наприклад — програмне забезпечення систем на кристалі (system-on-chip).

Повідомлення можна закодувати навіть у графі. Одну з таких технік запропонували Qu і Potkonjak (тому її іноді називають QP-алгоритмом) [21] .

Складається вона ось у чому: припустимо, у нас є граф G, розмальовка якого використовується в програмі - причому, використовується так, що можна змінити вміст графа з невеликим збільшенням його хроматичного числа. Що важливо, одним із таких прикладів є граф несумісності розподілу регістрів процесора, про який говорилося вище, а отже, ми зможемо закодувати послання у програмному продукті за допомогою розподілу регістрів.

Витягти його можна шляхом порівняння отриманого графа з вихідним; існують і способи переконатися в тому,чи було якесь повідомлення закодовано у графі без використання вихідного — докладніше витяг описано, наприклад, [22] .

Розвиток і уточнення думок Qu і Potkonjak, спроби покращення алгоритму відбувається в роботах [23], [24], [22].

Зазначимо, що у [23] , [24] є посилання програмний пакет SandMark, у якому виконані алгоритми такого роду; доступний для завантаження на [www 4] .