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


25

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

Особливості сучасних мов програмування, такі як збирання сміття або поліморфізм під час роботи, не підходять для HPC, оскільки швидкість має значення, тому не знайте, куди потрапляють C # або Java або C ++.

Будь-які думки?


9
C ++ не має сміттєзбірника, і це не вимагає від вас поліморфізму виконання.
Джейсон Бейкер

@Jason Моя мета - розібратися, які особливості C ++ роблять його переконливим випадком для HPC.
Fanatic23

@ Fanatic23 - я розумію. Просто хотів зробити це на заміті. :-)
Джейсон Бейкер

1
@Fanatic Wish Я можу сказати, що так, але у мене не так вже й багато ... У мене є маса посилань, що стосуються деяких проблем продуктивності в .NET / функціональних мовах. Ви можете бути в змозі зібрати поняття разом подумки , щоб отримати уявлення про деякі обмеження продуктивності: msdn.microsoft.com/en-us/library/0xy59wtx.aspx stackoverflow.com/questions/2909282 / ... msdn.microsoft.com/en -us / magazine / cc163329.aspx en.wikipedia.org/wiki/Just-in-time_compilation
Рей Міясака

1
Я думаю, що якщо вам потрібен справжній час відповіді, ви шукаєте ОС в режимі реального часу, як QNX: en.wikipedia.org/wiki/QNX
Rei Miyasaka

Відповіді:


11

Я бачив багато Java, яка використовується для HPC в тих областях, де (1) мало застарілого коду, і (2) важливий час розробки та якість коду. Типовими сферами застосування є фінанси, обмін даними або біоінформатика.

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

З огляду на фіксовану кількість часу на розробку програми, отриманий код Java стабільно швидше, ніж код C. HPC на Java безумовно має сенс, коли код розробляється чи змінюється часто. Ще одна важлива особливість - мобільність коду над різним обладнанням.

Ви знайдете посилання на http://ateji.blogspot.com/2010/09/java-for-high-performance-computing.html

Що стосується припущення Fortran, що дві адреси унікальні, ми працюємо над інструментом статичного аналізу, який дасть змогу подібні оптимізації для коду на мовах високого рівня, але без біту "Bad Things May Be Happen". Зверніться до мене, якщо цікавитесь.


14
Nitpick: Статистичні компілятори доступні для оптимізації JIT, якщо ви хочете трохи попрацювати. Як GCC, так і MS Visual Studio підтримують керовані оптимізацією профілю, які оптимізують за допомогою збережених даних часу виконання. Трохи вводити в оману припустити, що існують оптимізації, "які статичні компілятори (...) не можуть зробити".
Корбін березня

4
Я не знаю, чому це прийнята відповідь, ніщо в цій публікації не має виду істини. Мови, що базуються на C, завжди перевершують Java, оскільки Java - це віртуальна машина, притаманна іншою мовою. Крім того, все, що ви можете досягти на Java, ви можете досягти на C із меншими накладними витратами. Мови на базі C ніколи не перестануть бути мовою "виконавців".
Майк

31

У моєму багаторічному досвіді, до 5 років тому, це завжди були Fortran і C. Котрий з них в основному залежав від того, чи люди прийшли більше від інженерії, чи більше від школи думки CS (я не знаю, як це зробити краще , гаразд? :-)

У тому, що ми робили, Фортран майже виключно використовувався.

З того, що я читав сьогодні, з новими оновленнями стандарту F2003 / 08 та впровадженням Co-Arrays, здається, він знову набирає обертів.

Також одна, якщо не дещо упереджена стаття - Ідеальна мова програмування HPC


16

Я думаю, що для справжньої педалі до металу єдиний реальний вибір - Fortran. Аргументація полягає в тому, що найважливішим для експлуатації низькорівневого ІЛП (паралелізму рівня інструкцій) є розбір пам’яті адреси пам'яті. Правила defacto у Fortran дозволяють компілятору визначити, що дві адреси є унікальними (а отже, порядок завантажень і зберігання, або навіть магазини та магазини можуть бути замінені, не ризикуючи генерувати неправильний код). C залишає занадто багато можливостей для перекриття покажчиків для компілятора, щоб отримати якомога більше паралелізму низького рівня з коду.

Також вирівнювання масиву, лінії кеш-пам'яті wrt та межі SSE / AVX важливі для створення та виконання ефективних циклів. Якщо масиви передаються через загальні блоки, компілятор / завантажувач може запевнити, що всі масиви починаються на одних і тих же межах вирівнювання адреси, а також можна використовувати більш ефективні навантаження та сховища SSE / AVX. Більш нове обладнання може працювати з нестандартними доступами до пам'яті, але, оскільки доступ до пам'яті не вирівняний належним чином, часткове використання ліній кеша призводить до зниження продуктивності. Навіть якщо програміст C належним чином вирівняє всі свої масиви, чи існує механізм передачі цього компілятору?

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


2
Нещодавно я здійснив невеликий експеримент, знайшов кількість поп рядків 64000 біт, представлених як безпідписаний довгий довгий масив. Я використовував такий самий алгоритм, використовуючи багато цікавих булевих та запакованих арифметичних речей. У C з -O3 він займав 10 блоків на довгий час, тоді як для fortran Intel Fortran 10.1, за оптимізацією за замовчуванням він був 6,5! І кожен програміст думає, що C є кращим за обертання біт! Припущення дефакто Fortran дозволяють безпечно генерувати більш ефективне кодування інструкцій низького рівня.
Омега Кентаврі

4
Це повинно читати "Правила дефакто у Fortran дозволяють компілятору ВИЗНАЧИТИ, що дві адреси унікальні ...". Усі посібники говорять про те, що компілятору дозволено припустити це, і попереджають В ДЕТАЛІ, що погані речі можуть трапитися, якщо ви порушите це припущення.
Джон Р. Стром

15

Просто якась анекдотична записка. Я не робив жодних високоефективних обчислень.

Для обчислень (кількість хрускіт), Fortran і C. Так, це з застарілих причин:

  • Достатня доступність вихідного коду та рецептів публічного домену.
  • Обидва підтримують MPI .
  • Обидві мови складені.
  • Компілятори для обох мов надаються усіма операційними системами HPC та постачальниками.
  • Доступні векторизуючі компілятори.
  • Для обох потрібен шалений рівень налаштування, щоб отримати високу продуктивність при перенесенні в інший кластер (різний об'єм пам'яті, кількість процесорів тощо)
    • Це фактично пояснює, чому важливим є відкритий код: налаштування необхідне, тому оригінальний рецепт повинен бути написаний мовою, що підходить для налаштування вручну.

Сучасна тенденція скорочення чисельності полягає в написанні генераторів програм, які автоматизують налаштування вихідного коду з метою оптимізації продуктивності з урахуванням характеристик кластера. Ці генератори часто виводяться в С.

Друга тенденція - писати на якомусь спеціалізованому діалекті С для конкретних GPU або Cell BE.

Для нечислових робіт, таких як програми, що обробляють дані з бази даних (але не сама база даних), набагато дешевше працювати на кластерах «товарних» машин без дорогого індивідуального мережевого обладнання. Зазвичай це називається "Обчислення з високою пропускною здатністю". І Python тут є мовою №1 (використовуючи знамениту зменшення карт). До початку Python проекти пакетної обробки можуть бути написані будь-якою мовою і зазвичай надсилаються Condor .


1
Не могли б ви детальніше зупинитися на частині "шаленого рівня налаштування"?
Грак

Обчислювальний центр наймає аспірантів для перестановки дзвінків MPI, щоб зробити його швидшим.
rwong

(?) Перше слово тут, але, мабуть, практика відрізняється.
Грач

Це був дослідницький центр кліматичного моделювання.
rwong

4

Я працював над деяким ДУЖЕ інтенсивним розрахунковим кодом у (ах!) C #.

Я будую реалізацію FDTD для оптичного моделювання GPGPU . На невеликому (128 процесорному) кластері, для багатьох наших моделей потрібні тижні. Однак реалізація GPU, як правило, працює приблизно в 50 разів швидше - і це на картці NVidia споживача. Зараз у нас є сервер з двома двопроцесорними картами GTX295 (кілька сотень ядер), і ми скоро отримуємо кілька Teslas.

Як це стосується вашої мови? Так само, як C ++ FDTD-код, який ми використовували раніше, був пов'язаний з процесором, це пов'язані з графічним процесором, тому ( дуже мала) різниця кінських сил від керованого проти нативного коду ніколи не вступає в дію. Додаток C # виконує функцію провідника - завантажує ядра OpenCL, передає дані до та з графічних процесорів, забезпечує користувальницький інтерфейс, звітування тощо - всі завдання, які завдають біль дупі в C ++.

У минулі роки різниця в продуктивності між керованим і некерованим кодом була досить значною, що іноді варто було миритися зі страшною об'єктною моделлю C ++, щоб отримати додаткові кілька відсотків швидкості. У наші дні вартість розробки C ++ проти C # набагато переважає переваги для більшості програм.

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


1
c ++ має об'єктну модель? Але це здається, що вам слід було піти з мовою скрипту, щоб записати свої контролери - якщо C # кращий за C ++ через швидкість розробки, то python (або lua і т. Д.) Аналогічно кращий, ніж C #.
gbjbaanb

3
@gbjbaanb Не обов’язково. Ця реалізація пов'язана з графічним процесором, але перехід до мови сценаріїв може дуже легко змінити це. С # складено і має дуже приємний оптимізатор. Складені, сильно набрані мови - ваші друзі! Менш строгі мови написання, як правило, призводять до збільшення часу розробки для будь-якого досить складного проекту.
3Dave

1
Минуло сім років. Я багато чого навчився. c ++ досить приголомшливий, C # також приголомшливий, мені дуже подобається python і: CPU perf все ще має значення.
3Dave

3

Фортран є найпоширенішим, в першу чергу завдяки спадщині (люди все ще користуються старим кодом) та знайомістю (більшість людей, які роблять HPC, не знайомі з іншими мовами).

Особливості сучасних мов програмування, такі як збирання сміття або поліморфізм під час роботи, не підходять для HPC, оскільки швидкість має значення, тому не знайте, куди потрапляють C # або Java або C ++.

Це взагалі не вірно. Класичний HPC в основному робив лінійну алгебру з машинною точністю чисел. Однак сучасний HPC все частіше використовує суперкомп'ютери для ширшого розмаїття, як символічні обчислення з довільними математичними виразами замість машинних точних чисел. Це розміщує зовсім інші характеристики на інструментах, які ви використовуєте, і не рідкість використання мов програмування, крім Fortran, оскільки символічні обчислення можуть бути надзвичайно складними без GC та інших видів оптимізації компілятора, таких як оптимізаційний компілятор шаблону оптимізації OCaml.

Наприклад, прочитайте цю статтю Fischbacher et al. що говорить, що "автори мають вагомі підстави вважати, що це, можливо, найбільший символічний розрахунок, проведений досі".


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

3

Фортран, з якихось хороших і не дуже хороших причин. Для важкого математичного хрускоту є вагомою причиною, що є великі бібліотеки (BLAS, LAPACK) перевірених підпрограм, всі написані у Fortran (хоча їх можна назвати з C і C ++).

Не надто хороша причина - передбачувана перевага Fortran у порівнянні з C / C ++. Оптимізатори досить хороші, і мало хто розуміє, що користь від оптимізації фрагмента коду пропорційна відсотку часу, який він зайнятий, що майже в усьому коді майже дорівнює нулю.

Ще одна не дуже хороша причина - це розрив у культурі між CS та не-CS програмістами. Наукових програмістів, як правило, викладають шкідливі звички у Фортран, а також дивляться на програмістів CS та шкідливих звичок, яких вони навчали, і які дивляться на колишніх.


"Культурна розрив між CS та не-CS програмістами. Наукових програмістів, як правило, навчають шкідливим звичкам у Fortran, а також дивляться на програмістів CS та шкідливих звичок, яких вони навчали, і які дивляться на колишніх". Частково це лише те, що вони зосереджуються на різних аспектах проблеми. Фортран означає FORmula TRANSlation, і він досить ефективний при перекладі математичних формул у код. Для типів програм CS типи програмування зазвичай виконують інші мови.
Омега Кентаврі

1
@Omega: Ти маєш рацію. Люди, що навчаються у Фортран, як правило, не мають поняття форматування, ненавидять "неявного", і спірають код разом, оскільки вони все ще мають справу з рядками 72 символів і думають, що зрозумілий код призначений для сутенерів. Люди, які навчають CS, створюють монстрові піраміди класів, пронизані поліморфізмами, сповіщеннями та абстракціями, коли щось просте може зробити цю роботу. Тож вони заслуговують один на одного :)
Майк Данлаве

7
цитата була "фізики вирішують завтрашні проблеми на вчорашньому обладнанні - тоді як хлопці з CS вирішують проблеми вчорашнього дня на апаратному забезпеченні завтра"
Мартін Бекетт

@Martin: Я думаю, можливо, я десь це чув. Це впевнено звучить правда.
Майк Данлаве

Мартін: Отже, апаратні хлопці є найефективнішими :)
Dhaivat Pandya

2

В основному, всі програми, які виконують фактичну роботу зі скороченням чисел, як і раніше FORTRAN (старі blas, lapack, arnoldi тощо все ще використовуються) ... Однак, коли мова йде про структуру вищого рівня ... люди все частіше використовують C ++.

Складність моделювання пов'язана з величезним кодом, і отримати будь-яку вигоду від написання - це зробити його багаторазовим. Також використовувані поняття також стали дуже складними. Це майже божевілля представляти цю інформацію за допомогою FORTRAN. Ось де C ++ заходить, оскільки він по суті підтримує об'єктно-орієнтований дизайн. Однак поліморфізм під час виконання є рідкісним. Люди натомість майже завжди використовують статичний поліморфізм (який реалізується в C ++ за допомогою метапрограмування шаблонів)

Крім того, зараз компілятори справді хороші, тому багато оптимізації залишається компіляторам.


1

Існує два види проблем, які необхідно вирішити в додатках HPC: одна - це число, що розкривається, а інше - управління обчисленнями. До першого зазвичай звертаються з кодом, написаним на Fortran, C або C ++ через швидкість і через те, що вже існує багато наукових алгоритмів, написаних цими мовами. Управління обчисленнями зручніше реалізується на мовах вищого рівня. Python - це "клейова" мова вибору для обробки логіки програми та розширень для викликів, реалізованих у зібраних мовах. Java часто використовується проектами, в яких важливе значення має управління мережевими та розподіленими обчисленнями.

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