Современный C ++ в научных вычислениях?

22

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

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

Обратите внимание, что я не спрашиваю о библиотеках, которые используют эти функции. Я спрашиваю о статьях / книгах / и т.д., объясняющих, как я могу использовать эти возможности в научных вычислениях.

becko
источник
2
Вы спрашиваете о «современном» в смысле того, что считается лучшей практикой в ​​настоящее время (против 20 лет назад), или о «современном» в смысле конкретно C ++ 11/14?
Кирилл
2
@ Кирилл, я думаю, это оба. Главным образом то, что использует C ++ 11/14, но следуя рекомендациям.
Беко

Ответы:

11

Два примера библиотек, использующих современные конструкции C ++:

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

http://eigen.tuxfamily.org

http://arma.sourceforge.net/

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

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

http://www.cgal.org

Заметка:

современные конструкции C ++ очень элегантны и могут быть очень забавными в использовании. Это как сильная сторона, так и слабость: при использовании их настолько заманчиво добавить несколько слоев шаблонов / специализаций / лямбд, что в итоге иногда вы получаете больше «администрирования», чем эффективного кода в программе (другими словами, Ваша программа "говорит" больше о проблеме, чем о ее решении). Найти правильный баланс очень сложно. Вывод: необходимо отслеживать эволюцию отношения «сигнал / шум» в коде, измеряя :

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

Все, что увеличивает первые два, может рассматриваться как стоимость (потому что это может усложнить понимание и поддержку программы), все, что уменьшает последние два, является выгодой .

Например, введение абстракции (виртуальный класс или шаблон) может стать фактором кода и упростить программу ( усиление ), но если она никогда не создается и не запускается только один раз, то она вводит стоимость без ассоциированного усиления (опять же, это тонкий, потому что выигрыш может прийти позже в будущей эволюции программы, поэтому нет «золотого правила»).

Удобство программиста также является важным фактором, который необходимо учитывать при балансе затрат и выгод: при слишком большом количестве шаблонов время компиляции может значительно увеличиться, и сообщения об ошибках становятся трудными для анализа.

Смотрите также

В какой степени универсальное и метапрограммирование с использованием шаблонов C ++ полезно в вычислительной науке?

BrunoLevy
источник
2
То же самое касается и Армадилло, и Эйгена, нет?
dr.blochwave
Да, вы правы (я только что проверил документацию Армадилло, я менее знаком с ней). Я редактирую пост.
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 ++ для параллелизма).

У них есть список публикаций на их сайте, который включает в себя ряд примеров использования библиотеки для ускорения научных вычислений. В этом эпизоде ​​CppCast также очень интересно обсудить библиотеку и использование современного C ++ .

SteveL
источник
Добро пожаловать на scicomp.se! Если вы добавите ссылки или процитируете некоторые статьи / книги / посты в блогах, в которых обсуждается эта библиотека для научных вычислений, я с радостью поддержу ваш ответ!
твердый день
5

Я предлагаю взглянуть на Scientific and Engineering C ++: Введение с передовыми методами и примерами Бартона и Накмана .

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

Билл Грин
источник
4

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

Кристиан Валуга
источник
3

Книга «Руководство по научным вычислениям в C ++», написанная Питтом-Фрэнсисом и Уайтли, была написана для того, чтобы ответить именно на такие вещи (использование STL, итераторы и т. Д.), Которые доступны через Amazon или в виде электронной книги от издателя .

Раскрытие - я работаю в той же исследовательской группе, что и авторы, но все же считаю, что это очень хороший ресурс для этого!

mirams
источник
1

Я думаю, что эта книга идеально подходит для вас, как и для меня: «Знакомство с современным C ++: интенсивный курс для ученых, инженеров и программистов» (углубленное изучение C ++) Питера Готшлинга, особенно если его использовать в сочетании с принципами программирования и практикой использования. C ++ 2-е издание Бьярне Страуструп. Сам изобретатель C ++. Оба должны обеспечить прочную почву для того, чтобы стоять на них.

Рами Элькади
источник
0

Библиотека Blaze для линейной алгебры интенсивно использует C ++ 14 в форме выведенных и конечных типов возвращаемых данных. Другими современными функциями C ++ являются constexprшаблоны псевдонимов и множество метапрограммирования шаблонов с выражением SFINAE.

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

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

Для более подробной информации смотрите их начальную страницу .

Анри Менке
источник