Паралельне програмування із використанням С++

В рамках даного курсу студенти знайомляться та опановують найбільш сучасні підходи до розробки програм на мові програмування С++, різноманітні аспекти роботи операційних систем (потоки, процеси, віртуальна пам’ять), ієрархічну організацію комп’ютерних систем, управління компілятором та лінкером, програмування мультипроцесорів та створення паралельних (конкурентних) програм.

Теоретичні теми

  1. Абстракції комп’ютерної системи: центральний процесор; ієрархія пам’яті: RAM, Storage, інше; сопроцесори; засоби вводу-виводу. Характерні латентності різних операцій, роль буферизації та кешування. Ідея ISA та мікроархітектури. Розвиток ідей комп’ютерної техніки по спіралі.
  2. Представлення елементарних даних в пам’яті: цілі числа та числа із рухомою комою, текстові стрічки: кодові сторінки, Unicode, UTF-8/16/32, UCS. Відповідні типи даних С++ та інших мов програмування. Особливості роботи із числами з рухомою комою.
  3. Абстракції операційної системи: процеси та потоки; віртуальна пам’ять. Завантаження програм, динамічні бібліотеки. Зворотна сумісність. Види інтерфейсів користувача, командний рядок.
  4. Ієрархічна організація комп’ютерних систем. Компіляція та інтерпретація, JIT. Роздільна компіляція, зв’язування. Особливості С/С++, оптимізація та невизначена поведінка. Керування роботою компілятора та лінкера. Динамічні та статичні бібліотеки, раннє та пізнє зв’язування.
  5. Модель машини та модель пам’яті С, адресний простір процесу в сучасних операційних системах. Поняття про ABI, угоди про виклики. Особливості ABI C++. Огляд системи команд (ISA) x86.
  6. Види паралелізму: на рівні бітів, команд, задач. Класифікація Флінна. Оцінка ефекту від застосування паралелізації, закон Амдала та закон Густафсона.
  7. Підсистема пам’яті: принципи та функціонування кешу, віртуальна пам’ять та TLB.
  8. Мультипроцесори: SMP, SMT. Модель PRAM-машини. Когерентність кешів, моделі узгодженості пам’яті. UMA та NUMA-системи.
  9. Програмування мультипроцесорів. Паралельне та конкурентне програмування. Стан гонитви, гонитва даних. Засоби синхронізації. Потокобезпечні та lock-free структури даних. Deadlock i Livelock. Executor-и та пули потоків. Асинхронні засоби, співпрограми, модель N:M.
  10. API C++, Python, Java. Важливі сторонні реалізації: TBB, Folly, Boost, Qt.
  11. Створення паралельних програм. Методологія PCAM. Засоби перевірки: valgrind, concurrency visualizer, Intel parallel studio, clang sanitizers.

Практичні теми

  1. Робота із компілятором із командного рядка. Використання систем автоматичної побудови програм.
  2. Низькорівневе маніпулювання пам’яттю.
  3. Сучасне С++: шаблони, STL, лямбда-функції та інші елементи функціонального програмування. Узагальнене програмування.
  4. Написання найпростіших паралельних програм для SMT-систем. Заміри продуктивності.
  5. Реалізація конвеєрної обробки та Map-Reduce.
  6. Побудова потокобезпечних структур даних. Максимізація паралельності.
  7. Побудова розподілених систем із використанням MPI, Boost::MPI, Boost::asio.

Вимоги до попередніх знань учасників курсу

Знання синтаксису С++. Знання об’єктно-орієнтованого програмування.