Англійська для розробників Fortran

Словник для розробників, що підтримують і модернізують Fortran — масивно-орієнтована розмова про продуктивність, модуль проти застарілих спільних блоків, і словник взаємодії для наукових обчислювальних команд.

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

Ключовий словник

** Column- major order ** — розкладка зберігання Fortran для багатовимірних масивних даних, де послідовні елементи у стовпчику є суміжними у пам’ яті, протилежність мовам з великими рядками, наприклад, C, і часто джерело помилок швидкодії під час перенесення алгоритмів між цими двома мовами. “Ця вкладена петля повільна, оскільки вона ітерує перший рядок над масивом з головними колонками — змініть порядок петлі так, щоб внутрішня петля проходила пам’ ять безперервно, і ви побачите справжнє прискорення без будь- яких алгоритмічних змін.”

** Common block (legacy) ** — старий механізм Fortran для спільного використання глобального стану між підпрограмами за назвою, що існував до появи модулів, тепер вважається небезпечним для обслуговування, оскільки він не має безпеки типів і не має чіткого власника спільної пам’ яті.

  • “Ця помилка веде до спільного блоку — дві неспоріднені підпрограми обидві записують в один і той же регіон пам’ яті під різними змінними іменами, і нічого в мові не зупиняє їх від ступання одна на одну.” *

** Module (modern Fortran) ** — сучасна заміна спільних блоків, введена у Fortran 90, забезпечує безпечний з точки зору типів, явно обмежений обсяг спільного використання процедур і даних, а також стандартний спосіб, у який будь- який новий код Fortran має структурувати спільний стан. “Ми мігрували цей спільний стан з спільного блоку в відповідний модуль — тепер компілятор фактично перевіряє типи того, що спільно використовується, замість того, щоб довіряти тому, що кожна підпрограма погоджується з розташуванням пам’яті за угодою.”

** Сумісна співпраця (ISO_ C_ BINDING) ** — стандартний механізм виклику Fortran з C або навпаки з чітко визначеним відображенням типів, необхідний для наукових баз коду, які змішують числове ядро Fortran з шаром інтерфейсу C або Python. “Не вгадуйте виклику — декларуйте інтерфейс за допомогою ISO_C_BINDING, так що відображення типу між масивом Fortran і вказівником C є явним і компілятор його виконує, а не сподівається, що ABI буде вирівняно.”

** Векторизація ** — здатність компілятора перетворювати петлю на інструкції SIMD, що працюють одночасно на декількох елементах масиву, щось, що семантикою масиву Fortran і відсутністю типового псевдоніму компілятору легше досягти, ніж у мовах з псевдонімом вказівника. “Ця петля не векторизується, і звіт компілятора показує чому — існує залежність даних між ітераціями. Реструктуризуйте його, щоб вилучити цю залежність, і компілятор повинен бути здатний векторизувати його автоматично.”

Звичайні фрази

  • Чи будемо ми робити це в звичайному режимі, чи будемо ми робити це в режимі локального доступу?»
  • Чи є цей спільний стан все ще в спільному блоку, або він був мігрований до модуля?
  • Чи є інтерфейс C оголошений з ISO_C_BINDING, або ми покладаємося на прийняту конвенцію виклику?
  • Чи є це векторним циклом, чи залежність блокує його?»
  • «Чи ми вводимо новий спільний блок тут, або це має йти в модулі з самого початку?»

Приклади висловлювань

Пояснення виправлення швидкодії:

  • “Початковий порт з C ітерував масив у порядку від рядка до колонки, що є неправильним шаблоном доступу для розкладки Fortran з колонками. Перемикання порядку вкладення петлі дало нам 4x прискорення з нульовими змінами алгоритму.”*

Позначити застарілу небезпеку під час перегляду:

  • “Ця підпрограма все ще читає з спільного блоку, до якого також записують три інші файли, і жоден з них не погоджується з порядком полів. Ми повинні мігрувати це в модуль, перш ніж додавати будь-яку іншу логіку, яка від нього залежить.”*

Опис межі взаємодії: “Питомний обгортувач викликає це ядро Fortran через ISO_C_BINDING — блок інтерфейсу явно відображає кожен аргумент масиву Fortran на вказівник C і пару розмірів, тому ABI задокументовано в коді, а не просто припускається.”

Професійні поради

  • Завжди роздумуйте про колонний головний порядок явно при перенесенні числового коду між Fortran і мовами сімейства C — ця одна деталь спричиняє непропорційну частку помилок «чому це так повільно» в наукових обчисленнях.
  • Розглядати будь- який залишок ** спільного блоку ** як технічний борг, який слід мігрувати, а не шаблон, який слід розширювати — кожна нова змінна, додана до спільного блоку, збільшує радіус вибуху наступної вади, яку хтось відслідковує до нього.
  • Типовим буде ** модуль ** для будь- якого нового спільного стану або спільної процедури — це сучасна, безпечна заміна звичайних блоків, і це те, що буде потрібне у будь- якому поточному посібнику зі стилів Fortran.
  • Заявити межі між мовами з ** ISO_ C_ BINDING ** явно, а не покладатися на припущення про конвенцію виклику — незадеклароване припущення про сумісність ABI є саме тим видом помилки, який з’ являється лише на іншому компіляторі або платформі.
  • Перевірте звіт компілятора щодо оптимізації, щоб переконатися, що ** векторизація ** дійсно відбулася, а не припустити, що так і сталося — одна залежність даних або проблема з псевдонімами може беззвучно заблокувати її, і у звіті буде точно вказано, чому.

Практичні вправи

  1. Пояснити, чому доступ до масиву з головною колонкою важливий для швидкодії циклу у Fortran.
  2. Описати, чому спільні блоки вважаються небезпечними для обслуговування у порівнянні з модулями.
  3. Напишіть речення, у якому пояснюється призначення ISO_ C_ BINDING, коли код Fortran викликається з мови С.

Професійна мова: як мова професійна в глобальному колективі

Основна частина цього повідомлення присвячена створенню вашого словника з основних поняттів розробки Fortran — від розмірів масиву і керування пам’ яттю до розробки модулів у порівнянні зі старими звичайними блоковими структурами. Але давайте будемо чесні, технічної майстерності недостатньо. Важливим компонентом успіху, особливо при роботі з міжнародними командами, є здатність спілкуватися чітко, коротко і професійно англійською мовою. Це виходить за рамки простого знання визначень термінів; це розуміння того, як ці терміни використовуються в спільному середовищі розробки. Багато не-рідних мовців неохоче вносить свій внесок під час зустрічей або пише чіткі повідомлення про затвердження, боїться неправильного тлумачення. Це нерозуміння може сповільнити прогрес і створити непорозуміння. Ціль цього курсу полягає не лише у розширенні вашого технічного словника, але і у забезпеченні вас лінгвістичними інструментами, необхідними для впевненої участі у обговореннях щодо оптимізації продуктивності, перегляду коду і планування проектів. Це про передачу наміру і забезпечення того, щоб усі в команді були врівноважені.

Поширена проблема виникає при обговоренні розмірів масиву і шаблонів доступу до пам’яті - частою темою під час перегляду коду. Уявіть, що ви отримали коментар на зразок: « Цей цикл має неоптимальний доступ до пам’ яті; розгляньте можливість використання суміжних структур даних для поліпшення продуктивності ». Просто знати, що означає « суміжна структура даних », недостатньо для того, щоб ефективно відповісти на нього. Вам потрібна фраза, щоб сформулювати, чому це проблема і запропонувати рішення. Краще було б сказати: “Я вдячний за відгук. Спочатку я надав перевагу простоті у цьому циклі, але я розгляну використання суміжних масивних даних для поліпшення локалізації кешу. Чи можете ви розібратися у конкретному шаблоні доступу до пам’ яті, який викликає занепокоєння?» Зауважте зміну мови - визнання зворотнього зв’ язку, пояснення ваших початкових міркувань і пошуку пояснень. Це демонструє залученість і бажання навчатися. Аналогічно, під час опису Pull Request, вказати « Оптимізований доступ до масиву » є неясним. Складнішим описом може бути: « Перероблена петля для використання суміжних масивних даних для поліпшення продуктивності, скорочення затримки доступу до пам’ яті приблизно на 15%, за даними інструментів профілювання ». Точність у вашій мові створює довіру і уникає неоднозначності.

Інша область, де нюансована фраза є життєво важливою, це в розмовах Slack. Отримання повідомлення на зразок « Це потрібно виправити! » може бути неприємним без контексту. Професійнішою відповіддю було б: «Чи можете ви, будь ласка, надати більше деталей про проблему? Знаючи конкретне повідомлення про помилку або очікувану поведінку, ви зможете визначити пріоритетність виправлення. » Ключовим у цьому випадку є запит на пояснення — це ввічливий і активний підхід, який демонструє повагу до часу і досвіду ваших колег. Пам’ятайте, що ясність є найважливішою в спільній розробці програмного забезпечення.

# Example using gfortran profiling (simplified) - Illustrative only
gprof my_program | grep "cycles"

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

Поширені запитання

Про що ця стаття "Англійська для розробників Fortran"?

Словник для розробників, що підтримують і модернізують Fortran — масивно-орієнтована розмова про продуктивність, модуль проти застарілих спільних блоків, і словник взаємодії для наукових обчислювальних команд.

Чи безкоштовна ця стаття?

Так. Усі статті на CoderSlingo, включно з цією, доступні безкоштовно без реєстрації.

Скільки часу займає читання "Англійська для розробників Fortran"?

Приблизно 8 min.