Сучасний C ++ у наукових обчисленнях?


22

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

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

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


2
Ви запитуєте про "сучасне" у розумінні того, що вважається найкращою практикою в даний час (проти 20 років тому), або "сучасним" в сенсі конкретно C ++ 11/14?
Кирило

2
@Kirill Я думаю, що це і те, і інше. Переважно те, що використовує C ++ 11/14, але дотримуючись кращих практик.
бекко

Відповіді:


11

Два приклади бібліотек, які використовують сучасні конструкції C ++:

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

http://eigen.tuxfamily.org

http://arma.sourceforge.net/

http://hpac.rwth-aachen.de/teaching/sem-accg-14/Armadillo.pdf (презентація про шаблони виразів у Armadillo)

  • Бібліотека CGAL (обчислювальна геометрія) використовує багато сучасних функцій C ++ (вона широко використовує шаблони та спеціалізації):

http://www.cgal.org

Примітка:

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

  • скільки рядків коду в програмі?
  • скільки класів / шаблонів?
  • тривалість роботи ?
  • споживання пам'яті?

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

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

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

Дивись також

Наскільки загальне та метапрограмування з використанням шаблонів C ++ корисно в обчислювальній науці?


2
Це ж стосується і Армаділло, і Ейґена, ні?
dr.blochwave

Так, ви маєте рацію (я щойно перевірив документацію Armadillo, я з цим менш знайомий). Я редагую публікацію.
BrunoLevy

1
Більш тривалий час складання - ще одна вартість, яку варто згадати.
Кирило

@Kirill, так гарна точка (відредагував пост, щоб згадати про це), дякую.
BrunoLevy

10

Я б запропонував поглянути на Deal.II. Він використовує STL, це власні ітератори, спільні покажчики тощо.

Різні лінійні розв'язувачі можуть використовувати різні матриці через те, як це було розроблено. Я не натрапив на семантику руху, але це не означає, що їх там немає. Ось посилання.


Також OpenFOAM - досить широке використання шаблонів.
tpg2114

1
deal.II не використовує семантику переміщення (тому що він утримується від використання мовних функцій C ++ 11 - але він використовує функції C ++ 11 бібліотеки, на які в BOOST є заміни для старих компіляторів). Він використовує майже всі інші функції мови C ++, хоча, включаючи всі запитання в оригінальному запитанні.
Вольфганг Бангерт

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

7

Бібліотека HPX широко використовує низку функцій C ++ 11, таких як конструктори переміщення, а також має на меті бути повною реалізацією N4409 (Робочий проект, Технічна специфікація розширень C ++ для паралелізму).

На їхньому сайті є список публікацій, який містить низку прикладів використання бібліотеки для прискорення наукових обчислень. Також є така цікава дискусія про бібліотеку, і це використання сучасного C ++ у цьому епізоді CppCast .


Ласкаво просимо до scicomp.se! Якщо ви додасте посилання або цитуєте деякі статті / книги / дописи в блогах, які обговорюють цю бібліотеку для наукових обчислень, я з радістю схвалюю ваш відповідь!
хардмат

5

Пропоную поглянути на Науково-технічний C ++: Вступ із передовими методиками та прикладами Бартона та Накмана .

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


4

Окрім deal.ii (що вже було запропоновано тут), ви також можете ознайомитись з бібліотекою Dune, яка широко використовує деякі вдосконалені функції C ++, такі як метапрограмування шаблонів, діапазони ітераторів, розумні покажчики тощо. Також є недавній препринт Йоахіма Шьоберла, який коментує використання функцій C ++ 11, як, наприклад, лямбда-функції, для спрощення впровадження методів кінцевих елементів у NGSolve. Підвищеннятакож є деякі бібліотеки, пов'язані з науковим програмуванням, наприклад, uBLAS, Graph та ін. Я думаю, у більшості цих бібліотек ви знайдете хороші приклади сучасного використання C ++. Однак майте на увазі, що ви можете зіткнутися і з поганими прикладами використання розширеного / сучасного C ++. У деяких випадках, читаючи код / ​​документацію, у мене виникає відчуття, що час від часу речі значно надмірно узагальнені задля демонстрації передових навичок, таких як TMP, де для 99% усіх потенційних додатків більш простою реалізацією буде також робота.


3

Книга "Посібник з наукових обчислень на C ++" Пітта-Френсіса та Уайтлі була написана, щоб відповісти саме на такі речі (використання STL, ітераторів тощо), доступна через Amazon або як електронна книга від видавця .

Розкриття інформації - я працюю в тій же дослідницькій групі , що і автори, але все ще думаю, що це дуже хороший ресурс для цього!


1

Я думаю, що ця книга ідеально підходить для вас, як і для мене: Відкриття сучасного C ++: Інтенсивний курс для науковців, інженерів та програмістів (C ++ In-Depth) Пітера Готчлінга, особливо якщо його використовувати разом із Принципами програмування та використанням практики C ++ 2-е видання Bjarne Stroustrup. Сам винахідник С ++. Обидва повинні забезпечити міцний грунт, на якому можна стояти.


0

Бібліотека Blaze для лінійної алгебри широко використовує C ++ 14 у вигляді виведених та зворотних типів повернення. Іншими сучасними функціями C ++, які використовуються, є, наприклад constexpr, шаблони псевдоніму та ціла маса метапрограмування шаблонів із виразом SFINAE.

Ви також можете використовувати списки ініціалізаторів для своїх векторів і матриць, наприклад

blaze::DynamicVector<int> x{ 4, -1, 3 };

Детальніше дивіться на сторінці початку роботи .

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