up

Метапрограммирование шаблонов C++ в задачах математической физики

130 days
До конца записи
  • 12 недели

    длительность курса

  • от 3 до 4 часов в неделю

    понадобится для освоения

  • 3 зачётных единицы

    для зачета в своем вузе

О курсе

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

  1. Bjarne Stroustrup. The C++ Programming Language, Fourth Edition. Addison-Wesley, 2013. ISBN 978-0-321-56384-2, 1368 с.
  2. Bjarne Stroustrup. A Tour of C++. Addison-Wesley, 2014, 192 с. ISBN 978-0-321-95831-0.
  3. Бьерн Страуструп. Программирование: Принципы и практика с использованием C++, второе издание. пер. с англ., Вильямс, 2016, 1328 с. ISBN 978-5-8459-1949-6, 978-0-321-99278-9.
  4. Бьерн Страуструп. Дизайн и эволюция языка C++. ДМК Пресс, 2016, 446 с. ISBN 978-5-97060-419-9, 978-0-201-54330-8.
  5. David Abrahams, Aleksey Gurtovoy. C++ Template Metaprogramming. Addison-Wesley, 2004, 400 с. ISBN 978-0-321-22725-6.
  6. Краснов М.М. Метапрограммирование шаблонов C++ в задачах математической физики. М.: ИПМ им. М.В. Келдыша, 2017. 84с. URL: http://keldysh.ru/e-biblio/krasnov

Требования

Знание базового языка C++, желательно (но не обязательно) знание шаблонов в языке.

Программа курса

  1. Простейшие метафункции. Объясняется, что такое метафункция, приводятся примеры простейших метафункций (факториал, биномиальные коэффициенты, интеграл от одночленна по стандартному симплексу).
  2. На стыке компиляции и исполнения. Показывается, как часть вычислений может быть вынесена на стадию компиляции на примере степенной функции.
  3. Более сложные примеры. Вычисление простых чисел. Список чисел времени компиляции.
  4. Цикл времени компиляции. Вычисление интеграла от бинома, автоматическое раскрытие скобок, вычисление матрицы масс.
  5. Шаблонный полиморфизм и шаблоны выражений. Объясняется, что это такое, раскрывается шаблон CRTP, приводится простейший пример шаблонов выражений (калькулятор).
  6. Символьное дифференцирование. Показывается, как шаблоны выражений можно использовать для символьного дифференцирования формул. С помощью символьного дифференцирования методом Ньютона решается уравнение с одной и несколькими переменными, а также находится экстремальная точка у функции с несколькими переменными.
  7. Сеточно-операторный подход к программированию. Излагается разработанный автором подход к программированию, позволяющий в тексте программы кратко записывать сеточные выражения в виде, близком к математическому, и обеспечивающий автоматический (путём простой перекомпиляции) переносить программы на графические ускорители CUDA. 

Знания

  • Знать, что такое метафункции и метаклассы. Уметь применять как стандартные метафункции (из стандартной библиотеки языка), так и писать свои собственные. Владеть навыком «метафункционального» мышления.

  • Знать, что такое шаблонный полиморфизм (и его отличия от классического виртуального полиморфизма), что такое шаблон CRTP и шаблоны выражений. 

  • Понимать, что во многих математических вычислениях, зависящих от целочисленного параметра, значение которого известно во время компиляции, часть вычислений можно вынести на стадию компиляции, что уменьшает время счёта. Уметь это знание применять на практике.

  • Знать устройство цикла времени компиляции (фактически компилятор разворачивает цикл, так как число итераций цикла известно во время компиляции).

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

Умения

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

  • Уметь применять циклы времени компиляции для автоматизации логически сложных задач, таких, например, как автоматические раскрытие скобок.

  • Уметь с помощью шаблонов выражений строить свои предметно-ориентированные языки (DSL, Domain Specific Language).

Степин Евгений Викторович

Кандидат физико-математических наук
Должность: Заместитель директора центра инженерно-физических расчётов и суперкомпьютерного моделирования НИЯУ МИФИ

Краснов Михаил Михайлович

Кандидат физико-математических наук
Должность: Старший научный сотрудник ИПМ им. М.В. Келдыша РАН