Способи візуалізації даних про події в пошуку питань щодо ефективності


10

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

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

Історія рангів і ниток Пентаго

Моє запитання: які ще способи візуалізації цих даних можуть допомогти вирішити проблеми з ефективністю? Хтось має улюблений тип сюжету, який він використовує під час профілювання асинхронних програм?

Цей набір даних обмежений тим, що він не знає структури потоку даних, але я хотів би отримати якомога більше інформації про нього, перш ніж намагатися зібрати щось складніше.

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


У мене було досить багато проблем із завантаженням великого зображення моїм браузером або майже будь-якою іншою програмою. Зрештою, gimp це зробив, але ви, можливо, захочете переглянути параметри розміру чи формату файлу.
Педро

Вибач за те. Я думаю, що зображення є дійсним, оскільки Firefox дає мені ті ж помилки, що і запускається через конвертувати (ImageMagick). Можливо, він перевищує деякий довільний поріг розміру.
Джеффрі Ірвінг

Відповіді:


4

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

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

Оскільки ви використовуєте гібридний підхід із розділеною / розподіленою пам'яттю, я думаю, що ваш код в заготовках або очікує на MPI-виклик, або на змінну mutex / умова. Ви також можете зафіксувати ці дзвінки в таймерах, і це дасть вам кращу картину того, що сповільнює вас, наприклад, якщо це завжди однаково або завжди те саме, MPI_REDUCEщо ваші потоки застрягають.

Одне програмне забезпечення, яке я використовую досить часто, - це Intel Vtune Amplifier XE . Він має приємну схему / опцію побудови, яка візуалізує паралельність потоку. Програма намалює сюжет, дуже подібний до вашого, але коли нитка чекає на мютекс або змінну умови, вона намалює діагональну лінію з потоку очікування, у той момент, коли вона почала очікувати, до потоку, який фактично випустив мютекс або сигналізував стан, якого він чекав, під час звільнення / сигналізації. Це може бути дуже безладним, але це робить вузькі місця негайно.

Нарешті, я також збираю групові статистичні дані, наприклад, для кожного мутексу / сигналу / MPI-дзвінка, які були середні та максимальні терміни очікування? Яка гістограма зібраних термінів очікування? Незважаючи на те, що сюжет дає хороший огляд, він може стати досить безладним, коли йдеться про дрібні деталі.

Нарешті, одне питання, яке не варто недооцінювати: як ви збираєте таймінги? Ваш таймер недостатньо нав'язливий, щоб не впливати на ваш код? Я використовую кількість інструкцій процесора, коли це можливо, тобто RDTSCдля x86 архітектур. Зазвичай це просто додає одну інструкцію до вашого коду.


Дані вже мають блоки навколо усіх очікувань; на діаграмі вони показані білими для робочих ниток, що працюють в режимі очікування, і жовтими для потоків зв'язку в очікуванні. На жаль, всі очікування в потоці зв'язку відбуваються в одній ковдрі MPI_Waitsome за рахунок асинхронії. Vtune не застосовується в цьому випадку, оскільки суто поточна продуктивність по суті ідеальна, але дякую за покажчик. Пропозиція гістограми теж хороша.
Джеффрі Ірвінг

Що стосується термінів накладних витрат: я використовую gettimeofday, який необхідний принаймні навколо простою розділів, оскільки там я використовую змінні умови pthread. Чи можна змусити підрахунок інструкцій процесора працювати в такій ситуації? Накладні витрати вже досить низькі, але нижче, безумовно, було б приємніше.
Джеффрі Ірвінг

1
@GeoffreyIrving: Так, ви можете використовувати їх, але вони мають сенс лише для процесорів, у яких встановлено constant_tscпрапор (перевірити /proc/cpuinfo), і якщо ви використовуєте фіксацію кожного потоку в певному ядрі, тобто кожен потік завжди читає той самий реєстр з одного ядра, наприклад використання pthread_setaffinity_np. Зауважте, що остання є специфічною для Linux і тому не є портативною.
Педро

@GeoffreyIrving: Навіть якщо вас чекає якась нерозкрита подія MPI_Waitsome, ви все одно можете записати, які запити надійшли та звідки. Ця інформація може бути або не корисною ...
Педро

5

Іноді можна отримати альтернативне уявлення про проблеми продуктивності за допомогою аналізу ресурсів високого рівня: Чи є відповідне вузьке місце, наприклад, пропускна здатність пам'яті? Чи кожен робочий потік виконує однакову кількість роботи? Ці дані можуть бути легко зібрані за допомогою likwid-perfctr з набору інструментів LIKWID з проекту коду LIKWID Google . Якщо профіль такий, що існує багато різних гарячих точок, вам може знадобитися вирішувати їх по черзі. Також можуть виникати різні проблеми, залежно від кількості потоків / процесів.


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

2

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

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

Удачі.


Іншими словами, корисної візуалізації даних, які я маю, немає. :) Джед Браун запропонував Jumpshot (та пов’язані з ними утиліти) як один із способів збирання та візуалізації запропонованих вами даних, тому я розбираюсь у цьому.
Джеффрі Ірвінг

@Geof: удачі з візуалізацією. Єдиним інструментом, який я вважав би корисним, є те, що збирати та об’єднувати журнали подій, щоб я міг слідувати шляхом одного або декількох запитів, коли він пробирався через різні потоки, тому що це єдиний спосіб, з якого я знаю, щоб виявити непотрібне затримки. Ось з чого складається будь-яка проблема продуктивності - непотрібні затримки.
Майк Данлаве
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.