Скільки слід оптимізувати наукове програмне забезпечення?


13

Для додатків, які потребують значних обчислювальних ресурсів, висока продуктивність може бути вирішальним фактором, коли справа стосується досягнення наукових результатів або досягнення «проривів» у розумні строки.

Скільки потрібно часу і сил, щоб розробники програмного забезпечення вклали гроші в оптимізацію програми? Які ключові критерії використовуються?


Програми, які пишуть науковці, часто працюють дуже довго (наприклад, моделювання). Час програміста та час роботи комп'ютера можуть бути порівнянні. Це дуже відрізняється від сьогоднішньої "звичайної" роботи програміста. Як і в перші дні обчислень, часто варто вкласти певні зусилля (і час програміста), щоб зробити симуляцію швидше і швидше закінчити, а роботу швидше виконати.
Szabolcs

Відповіді:


15

У переважній більшості випадків вдосконалення алгоритмів мають більшу різницю, ніж поліпшення оптимізації. Алгоритми також більш портативні, ніж оптимізації низького рівня. Моя порада - дотримуватися загальних найкращих практик щодо компонування пам’яті для повторного використання кешу, уникати надмірних копій чи зв’язку, обробляти файлову систему розумним способом, а ядра з плаваючою комою мають достатню деталізацію для векторизації. Іноді цього достатньо, щоб досягти прийнятно високої частки "піку" (для цієї операції).

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

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


1
Нещодавно я отримав коефіцієнт 10000 (для наших найбільших подій) поліпшення часу виконання обмежувального кроку нашого аналізу, просто замінивши алгоритм, який був O (n ^ 2) у часі та просторі одним O (n log n ) в обох. Зверніть увагу, це означало ще одну залежність і деяку додаткову складність, але іноді воно того варте ...
dmckee --- кошеня колишнього модератора

1
Фактори прискорення (які відносно чогось відносяться) не надто варті чіткого посилання на те, що ви порівняли. Якщо ви порівнюєте з поганою реалізацією на основі невідповідного алгоритму, а потім змінюєте, то, очевидно, не було б розумним очікувати великих відносних вигод.
Аллан П. Енгсіг-Каруп

1
@Allan: Для отримання однієї зміни потрібно було отримати 10 000 факторів, тоді, очевидно, це було неправильно обраною реалізацією. Попередній код постраждав не стільки від зайвого простору, скільки за часової складності: ефективність кешування була ненормальною. Але в цьому справа, чи не так?
dmckee --- кошеня колишнього модератора

8

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

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

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

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


4

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

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

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


4

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

Як правило, правило - це відоме правило 80/20. У якийсь момент він просто не додає більше витрачати більше часу на здобуття кількох відсотків (або менше) часу роботи. Але вам доведеться проаналізувати.

І я щиро погоджуюся з вищезазначеними плакатами: переконайтеся, що ваш API добре продуманий, тому він не потребує багатьох змін і переконайтесь, що код є переносним та ремонтопридатним (подумайте про необхідність повторного аналізу алгоритму, який ви написали, і nitty-gritty оптимізовано десять років тому). І переконайтеся, що ви використовуєте добру практику програмування та стандартні бібліотеки. Швидше за все, хтось уже задумався про найефективніший алгоритм для вашої програми.

Цитувати Дональда Кнута: "передчасна оптимізація - корінь усього зла". Тож профіліруйте свій код, але не надто скоро.


Ви посилаєтесь на правило Парето (80/20)? Якщо так, то ви маєте на увазі, що ми повинні зосередити зусилля з оптимізації на 20% коду, який створює 80% уповільнення? Або ти маєш на увазі, що якщо ти можеш очікувати лише 20% швидкості, то оптимізувати це просто не варто?
Павло

Ні, я використовував це лише як якийсь принцип, а не точно 80/20. У якийсь момент ви витратите стільки зусиль, щоб набрати лише кілька відсотків, що більше не варто докладати зусиль.
GertVdE

3

Деякі додаткові поради:

  1. Перш ніж проводити оптимізацію робочої програми, переконайтеся, що у вас є гарний набір тестових випадків, які допомагають підтримувати цілісність коду. Немає сенсу швидше отримувати неправильні результати.
  2. Якщо ваша оптимізація робить код менш читабельним, зберігайте оригінальну версію навколо, принаймні, у формі коментаря, але краще як альтернативну версію, яку слід вибирати під час компіляції та час виконання. Ваші потреби в оптимізації можуть змінюватися, оскільки ваші проблеми і ваші машини розвиваються, а вихідний код може стати кращою відправною точкою для оптимізації, яку ви будете робити через п'ять років.
  3. Якщо ваша оптимізована версія виявляється з мінімальним впливом, але робить код менш читабельним, менш універсальним або менш стабільним, поверніться до початкової версії. Ви втрачаєте більше, ніж отримуєте.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.