Я ищу книги или статьи, или посты в блогах, или любые опубликованные материалы в целом, которые конкретно касаются использования современных функций C ++ (семантика перемещения, STL, итераторы, ленивая оценка и т. Д.) В научных вычислениях. Можете ли вы предложить любой?
Я думаю, что эти новые функции облегчат написание эффективного кода, но я не нашел реальных примеров. Большинство ссылок, которые я прочитал, касаются общего использования C ++ и не содержат примеров научных вычислений. Поэтому я ищу примеры (не обязательно примеры производственного кода, просто педагогические примеры, скажем, на уровне числовых рецептов) научного вычислительного кода с использованием современных функций C ++.
Обратите внимание, что я не спрашиваю о библиотеках, которые используют эти функции. Я спрашиваю о статьях / книгах / и т.д., объясняющих, как я могу использовать эти возможности в научных вычислениях.
источник
Ответы:
Два примера библиотек, использующих современные конструкции C ++:
http://eigen.tuxfamily.org
http://arma.sourceforge.net/
http://hpac.rwth-aachen.de/teaching/sem-accg-14/Armadillo.pdf (презентация по шаблонам выражений в броненосце)
http://www.cgal.org
Заметка:
современные конструкции C ++ очень элегантны и могут быть очень забавными в использовании. Это как сильная сторона, так и слабость: при использовании их настолько заманчиво добавить несколько слоев шаблонов / специализаций / лямбд, что в итоге иногда вы получаете больше «администрирования», чем эффективного кода в программе (другими словами, Ваша программа "говорит" больше о проблеме, чем о ее решении). Найти правильный баланс очень сложно. Вывод: необходимо отслеживать эволюцию отношения «сигнал / шум» в коде, измеряя :
Все, что увеличивает первые два, может рассматриваться как стоимость (потому что это может усложнить понимание и поддержку программы), все, что уменьшает последние два, является выгодой .
Например, введение абстракции (виртуальный класс или шаблон) может стать фактором кода и упростить программу ( усиление ), но если она никогда не создается и не запускается только один раз, то она вводит стоимость без ассоциированного усиления (опять же, это тонкий, потому что выигрыш может прийти позже в будущей эволюции программы, поэтому нет «золотого правила»).
Удобство программиста также является важным фактором, который необходимо учитывать при балансе затрат и выгод: при слишком большом количестве шаблонов время компиляции может значительно увеличиться, и сообщения об ошибках становятся трудными для анализа.
Смотрите также
В какой степени универсальное и метапрограммирование с использованием шаблонов C ++ полезно в вычислительной науке?
источник
Я бы посоветовал взглянуть на Deal.II. Он использует STL, собственные итераторы, общие указатели и т. Д.
Различные линейные решатели могут использовать различные матрицы из-за того, как это было разработано. Я не сталкивался с использованием семантики перемещения, но это не значит, что их там нет. Вот ссылка.
источник
Библиотека HPX интенсивно использует ряд функций C ++ 11, таких как конструкторы перемещения, и также стремится стать полной реализацией N4409 (рабочий проект, техническая спецификация расширений C ++ для параллелизма).
У них есть список публикаций на их сайте, который включает в себя ряд примеров использования библиотеки для ускорения научных вычислений. В этом эпизоде CppCast также очень интересно обсудить библиотеку и использование современного C ++ .
источник
Я предлагаю взглянуть на Scientific and Engineering C ++: Введение с передовыми методами и примерами Бартона и Накмана .
Тот факт, что эта книга была опубликована в 1994 году, нарушает ваш критерий «современных методов». Однако Бартон и Нэкманн в то время были на переднем крае того, что было возможно с шаблонами C ++, и инновационные методы, которые они разработали для достижения хорошей производительности, все еще используются в новейших библиотеках классов C ++.
источник
Помимо deal.ii (который уже был предложен здесь), вы также можете взглянуть на библиотеку Dune, которая широко использует некоторые расширенные функции C ++, такие как метапрограммирование шаблонов, диапазоны итераторов, умные указатели и так далее. Также имеется недавний препринт Йоахима Шоберла, который комментирует использование функций C ++ 11, таких как, например, лямбда-функции, для упрощения реализации методов конечных элементов в NGSolve. Увеличениетакже есть несколько библиотек, связанных с научным программированием, таких как uBLAS, Graph и т. д. Я думаю, что в большинстве из этих библиотек вы найдете хорошие примеры современного использования C ++. Однако имейте в виду, что вы можете столкнуться и с плохими примерами использования продвинутого / современного C ++. В некоторых случаях, читая код / документацию, у меня возникало ощущение, что иногда вещи сильно переобобщаются ради демонстрации таких продвинутых навыков, как TMP, где для 99% всех потенциальных приложений более простая реализация также будет выполнять работа.
источник
Книга «Руководство по научным вычислениям в C ++», написанная Питтом-Фрэнсисом и Уайтли, была написана для того, чтобы ответить именно на такие вещи (использование STL, итераторы и т. Д.), Которые доступны через Amazon или в виде электронной книги от издателя .
Раскрытие - я работаю в той же исследовательской группе, что и авторы, но все же считаю, что это очень хороший ресурс для этого!
источник
Я думаю, что эта книга идеально подходит для вас, как и для меня: «Знакомство с современным C ++: интенсивный курс для ученых, инженеров и программистов» (углубленное изучение C ++) Питера Готшлинга, особенно если его использовать в сочетании с принципами программирования и практикой использования. C ++ 2-е издание Бьярне Страуструп. Сам изобретатель C ++. Оба должны обеспечить прочную почву для того, чтобы стоять на них.
источник
Библиотека Blaze для линейной алгебры интенсивно использует C ++ 14 в форме выведенных и конечных типов возвращаемых данных. Другими современными функциями C ++ являются
constexpr
шаблоны псевдонимов и множество метапрограммирования шаблонов с выражением SFINAE.Вы также можете использовать списки инициализаторов для ваших векторов и матриц, например
Для более подробной информации смотрите их начальную страницу .
источник