Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Научно-технические семинары

  • Семинары по архитектуре процессоров НТЦ Модуль NeuroMatrix (осень-весна, 2025-2026)

Текущие учебные дисциплины

  • Параллельные вычислительные технологии (бакалавриат, СибГУТИ, 2 семестра, весна-осень, 2-3 курсы)
  • Компиляторные технологии (бакалавриат, СибГУТИ, осень, 4 курс)
  • Программирование встраиваемых систем (бакалавриат, СибГУТИ, весна, 3 курс)
  • Архитектурно-ориентированная оптимизация кода (курс повышения квалификации, СибГУТИ)

Архив курсов

  • Распределенная обработка информации (магистратура, СибГУТИ, осень-весна, 2019-2023)
  • Параллельные программирование (магистратура, СибГУТИ, 2016-2018)
  • Введение в параллельное программирование (семинары ИФП СО РАН, 2015-2016)
  • Параллельные и распределенные вычисления (Школа анализа данных Яндекс, НГУ, 2014-2016)
  • Высокопроизводительные вычислительные системы (СибГУТИ, 2010-2016)
  • Структуры и алгоритмы обработки данных (СибГУТИ, 2012-2016)
  • Теория функционирования распределенных вычислительных систем (СибГУТИ, 2007-2013)
  • Теория вычислительных процессов (СибГУТИ, 2006-2012)

Контакты

  • Курносов Михаил Георгиевич, д.т.н., профессор, профессор кафедры вычислительных систем СибГУТИ
  • WWW: https://www.mkurnosov.net
  • E-mail: mkurnosov[at]sibguti.ru
  • Telegram: [at]mkurnosov
  • Offline: СибГУТИ, Кафедра вычислительных систем, к. 403а

Процессоры цифровой обработки сигналов НТЦ Модуль NeuroMatrix

Здесь собраны материалы цикла семинаров по архитектуре процессоров цифровой обработки сигналов НТЦ Модуль NeuroMatrix.

Записи семинаров

Материалы семинаров

Erlang Q&A

Атомы

Сколько атомов может создать Erlang процесс?

Небольше чем заданный при запуске виртуальной машины BEAM размер глобальной таблицы атомов. По умолчанию таблица вмещает 1_048_576 атомов. https://www.erlang.org/doc/system/system_limits.html#atoms

Атомы хранятся в глобальной таблице, которая разделяется всеми процессами виртуальной машины BEAM. Размер таблицы можно увеличить при старте BEAM (опция командной строки erl +t).

Таблица очищается при завершении BEAM и не очищается сборщиком мусора во время выполнения. Нужно избегать динамического порождения атомов (list_to_atom/1, binary_to_atom/1).

Как узнать предельное количество атомов в глобальной таблице?

Функция erlang:system_info(atom_limit)

  • atom_count - количество атомов в таблице текущего узла
  • atom_limit - максимальное количество атомов в таблице текущего узла

Размер памяти занятый атомами:

  • erlang:memory(atom) - размер памяти занятой атомами и резервом места под них
  • erlang:memory(atom_used) - размер памяти занятой атомами

Как переполнить таблицу атомов?

При переполнении таблицы выводится сообщение "no more index entries in atom_tab (max=1048576)", виртуальная машина аварийно завершает работу "Crash dump is being written to...".

-module(atoms).
-export([gen/1]).

gen(N) when is_integer(N), N > 0 ->
    mem_usage("Before"),
    gen_rec(N),
    mem_usage("After").

gen_rec(1) -> create_atom(1);
gen_rec(N) when is_integer(N), N > 1 ->
    create_atom(N - 1),
    gen_rec(N - 1).

create_atom(N) ->
    try
        AtomName = "atom_" ++ integer_to_list(os:system_time(microsecond)) ++ "_" ++ integer_to_list(rand:uniform(1000000)),
        list_to_atom(AtomName)
    catch
        error:Reason -> io:format("Can not create atom: N = ~p (~p)~n", [N, Reason])
    end.

mem_usage(Str) ->
    io:format("~p: atoms table: reserved ~p atoms, used ~p atoms, memory reserved + used ~.2f MiB, memory used ~.2f MiB~n",
              [Str, erlang:system_info(atom_limit), erlang:system_info(atom_count),
               erlang:memory(atom) / 1024 / 1024, erlang:memory(atom_used) / 1024 / 1024]).

Компилируем и запускаем генерацию > 2_000_000 атомов:

$ erlc ./atoms.erl

$ erl +t 2000000 -eval "atoms:gen(2_900_000)." -noshell -s init stop

Списки

Как реализованы списки в Erlang?

Тип list в Erlang - это базовый тип поддерживаемый виртуальной машиной BEAM. Он реализован как односвязный список (singly linked list), в котором каждый элемент (cons cell) содержит указатель на голову (head, car) и указатель на хвост (tail, cdr) - следующий элемент в списке. Реализация на C:

struct cons_cell {
    Eterm *head;     /* Указатель на значение (value) */
    Eterm *tail;     /* Указатель на следующий элемент */
};
  • The BEAM Book: Understanding the Erlang Runtime System. "Chapter 4.3. Lists" // https://blog.stenmans.org/theBeamBook/?ref=crustofcode.com#_lists

Каждая ячейка (cons cell) занимает два машинных слова BEAM. Список из N элементов занимает минимум 2 * N машинных слов для указателей head и tail. Если элемент помещается в машинное слово, то его значение хранится в head вместо указателя. Например, список из 1 миллиона целых чисел (small integers) требует 1 миллиона cons ячеек - на 64-битной машине это 2 * 8 * 10^6 байт.

Операции добавления элементов:

  • Prepend: добавления элемента Head в начала списка Tail (prepend, cons): [Head | Tail], требует только корректировки указателя tail элемента Head, время выполнения O(1)
  • Append: конкатенация списков L3 = L1 ++ L2, L3 = lists:append(L1, L2): выполняет копирование элементов L1 и связывает последний элемент со головой L2, время выполнения O(|L1|).

Чем отличаются [1, 2 | [a, b, c]] и [1, 2] ++ [a, b, c]?

  • (быстрее) Выражение [1, 2 | [a, b, c]] - это операция prepend, связывает указатель tail элемента 2 с головой списка [a, b, c], выполняется только корректировка указателя за время O(1).
  • (медленнее) Выражение [1, 2] ++ [a, b, c] - это операция append; создается копия списка [1, 2], элемент 2 нового списка связывается с головой списка [a, b, c], необходимо выполнить копирование первого списка и откорректировать указатель.

Где хранятся списки и чем ограничена их длина?

Списки хранятся в куче (heap) процесса. Длина списка ограничена доступной памятью для кучи.

По умолчанию куча может расти до ограничений BEAM и операционной системы. Сборщик мусора (garbage collector, GC) увеличивает кучу по мере необходимости. Ограничения на размер кучи для процесса можно установить через вызов функции process_flag(max_heap_size, ...).

Дерево супервизоров распределенной СУБД CouchDB

CouchDB — документо-ориентированная распределенная система управления базами данных с открытым исходным кодом (NoSQL). Одной из особенностей является поддержка репликации с несколькими ведущими узлами (multi-primary, multi-master).

https://github.com/apache/couchdb

На основе CouchDB построены: IBM Cloudant, СУБД Енисей.

Запуск Erlang VM (BEAM)

Когда CouchDB запускается из релиза (например, _rel/bin/couch start), Erlang VM (BEAM) инициализирует базовую среду и запускает два критчески важных приложения, без которых не может работать ни один Erlang-узел: kernel и stdlib.

  • kernel отвечает за базовые сервисы: загрузку кода, логирование, работу с файловой системой, управление приложениями.
  • stdlib - стандартная библиотека Erlang/OTP.

Старт kernel и создание контроллера приложений

В процессе запуска приложения kernel его внутренняя логика создает процесс, который регистрируется под именем application_controller. Он существует с момента старта узла до его остановки.

Запуск приложения CouchDB

Для запуска приложения couch (src/couch/src/couch.app.src) контроллер application_controller выполняет следующие действия:

  • запускает приложения из списка зависимостей приложения couch: {applications, [kernel, stdlib, ..., ibrowse, mochiweb, ...]}
  • из стартового модуля вызывает couch_app:start/2, который создает дерево супервизоров (couch_sup:start_link()).

Дерево супервизоров CouchDB

CouchDB Supervisor tree

Параллельные вычислительные технологии (ПВТ)

Осенний семестр 2025

17 лекций, 17 практических занятий, курсовая работа, экзамен

Экзамен

Курсовая работа

Материалы лекций

Практические работы

Лабораторные работы выполняются в операционной системе GNU/Linux на языках программирования C/C++.

Материалы по курсу

Параллельные вычисления

  • Эндрюс Г. Основы многопоточного, параллельного и распределенного программирования. - М.: Вильямс, 2003.
  • Лацис А. Параллельная обработка данных. - М.: Академия, 2010.
  • Расс Миллер, Лоренс Боксер. Последовательные и параллельные алгоритмы. - М.: Бином, 2009
  • Ian Foster. Designing and Building Parallel Programs

Многопоточное программирование

  • Уильямс Э. Параллельное программирование на С++ в действии. Практика разработки многопоточных программ. - М.: ДМК Пресс, 2012.
  • Шамим Эхтер, Джейсон Робертс. Многоядерное программирование. - СПб.: Питер, 2010.
  • Maurice Herlihy, Nir Shavit. The Art of Multiprocessor Programming, Morgan Kaufmann, 2012
  • Darryl Gove. Multicore Application Programming: for Windows, Linux, and Oracle Solaris, Addison-Wesley, 2010
  • Richard H. Carver, Kuo-Chung Tai. Modern Multithreading : Implementing, Testing, and Debugging Multithreaded Java and C++/Pthreads/Win32 Programs, Wiley-Interscience, 2005
  • Gadi Taubenfeld. Synchronization Algorithms And Concurrent Programming, Pearson, 2006

OpenMP

  • http://www.openmp.org/mp-documents/OpenMP4.0.0.pdf OpenMP 4.0 Specification
  • Антонов А.С. Параллельное программирование с использованием технологии OpenMP. - М.: МГУ, 2009
  • Алексей Колосов, Андрей Карпов, Евгений Рыжков. 32 подводных камня OpenMP при программировании на Си++, 2009
  • Антонов А.С. Технологии параллельного программирования MPI и OpenMP. - М.: МГУ, 2012
  • Tim Mattson. A “Hands-on” Introduction to OpenMP
  • Advanced OpenMP Topics // NAS Webinar, 2012

MPI

  • MPI 4.0 Standard, 2021
  • Курносов М.Г. Алгоритмы коллективных операций стандарта MPI. - М.: Горячая Линия - Телеком, 2025. - 288 с. ISBN 978-5-9912-1149-9
  • Supalov A. Inside MPI, 2020
  • Антонов А.С. Параллельное программирование с использованием технологии MPI. - М.: МГУ, 2004
  • Pavan Balaji, Torsten Hoefler. MPI for Dummies // ACM Symposium on Principles and Practice of Parallel Programming, 2013
  • Pavan Balaji, Torsten Hoefler. Advanced Parallel Programming with MPI-1, MPI-2, and MPI-3 // ACM Symposium on Principles and Practice of Parallel Programming, 2013
  • Rolf Rabenseifner, Georg Hager, Gabriele Jost. Hybrid MPI and OpenMP Parallel Programming // Day-long tutorial on Hybrid MPI and OpenMP Parallel Programming from SC13, 2013

Архитектура вычислительных систем

  • Хорошевский В.Г. Архитектура вычислительных систем. - М.: МГТУ им. Н. Э. Баумана, 2008.
  • Корнеев В.В. Вычислительные системы. – М.: Гелиос АРВ, 2004. – 512 с.
  • Степаненко С.А. Мультипроцессорные среды суперЭВМ. Масштабирование эффективности. – М.: ФИЗМАТЛИТ, 2016. – 312 с.
  • Столлингс В. Структурная организация и архитектура компьютерных систем. - М.: Вильямс, 2002
  • John L. Hennessy, David A. Patterson. Computer Architecture: A Quantitative Approach, 5 ed., Morgan Kaufmann, 2011
  • Randal E. Bryant, David R. O'Hallaron. Computer Systems: A Programmer's Perspective. - Addison-Wesley, 2010
  • Denis Bakhvalov. Performance Analysis and Tuning on Modern CPUs: Squeeze the last bit of performance from your application, 2020

Параллельные вычислительные технологии (ПВТ)

Осенний семестр 2025

17 лекций, 17 практических занятий, курсовая работа, экзамен

Экзамен

Курсовая работа

Материалы лекций

Практические работы

Лабораторные работы выполняются в операционной системе GNU/Linux на языках программирования C/C++.

Материалы по курсу

Параллельные вычисления

  • Эндрюс Г. Основы многопоточного, параллельного и распределенного программирования. - М.: Вильямс, 2003.
  • Лацис А. Параллельная обработка данных. - М.: Академия, 2010.
  • Расс Миллер, Лоренс Боксер. Последовательные и параллельные алгоритмы. - М.: Бином, 2009
  • Ian Foster. Designing and Building Parallel Programs

Многопоточное программирование

  • Уильямс Э. Параллельное программирование на С++ в действии. Практика разработки многопоточных программ. - М.: ДМК Пресс, 2012.
  • Шамим Эхтер, Джейсон Робертс. Многоядерное программирование. - СПб.: Питер, 2010.
  • Maurice Herlihy, Nir Shavit. The Art of Multiprocessor Programming, Morgan Kaufmann, 2012
  • Darryl Gove. Multicore Application Programming: for Windows, Linux, and Oracle Solaris, Addison-Wesley, 2010
  • Richard H. Carver, Kuo-Chung Tai. Modern Multithreading : Implementing, Testing, and Debugging Multithreaded Java and C++/Pthreads/Win32 Programs, Wiley-Interscience, 2005
  • Gadi Taubenfeld. Synchronization Algorithms And Concurrent Programming, Pearson, 2006

OpenMP

  • http://www.openmp.org/mp-documents/OpenMP4.0.0.pdf OpenMP 4.0 Specification
  • Антонов А.С. Параллельное программирование с использованием технологии OpenMP. - М.: МГУ, 2009
  • Алексей Колосов, Андрей Карпов, Евгений Рыжков. 32 подводных камня OpenMP при программировании на Си++, 2009
  • Антонов А.С. Технологии параллельного программирования MPI и OpenMP. - М.: МГУ, 2012
  • Tim Mattson. A “Hands-on” Introduction to OpenMP
  • Advanced OpenMP Topics // NAS Webinar, 2012

MPI

  • MPI 4.0 Standard, 2021
  • Курносов М.Г. Алгоритмы коллективных операций стандарта MPI. - М.: Горячая Линия - Телеком, 2025. - 288 с. ISBN 978-5-9912-1149-9
  • Supalov A. Inside MPI, 2020
  • Антонов А.С. Параллельное программирование с использованием технологии MPI. - М.: МГУ, 2004
  • Pavan Balaji, Torsten Hoefler. MPI for Dummies // ACM Symposium on Principles and Practice of Parallel Programming, 2013
  • Pavan Balaji, Torsten Hoefler. Advanced Parallel Programming with MPI-1, MPI-2, and MPI-3 // ACM Symposium on Principles and Practice of Parallel Programming, 2013
  • Rolf Rabenseifner, Georg Hager, Gabriele Jost. Hybrid MPI and OpenMP Parallel Programming // Day-long tutorial on Hybrid MPI and OpenMP Parallel Programming from SC13, 2013

Архитектура вычислительных систем

  • Хорошевский В.Г. Архитектура вычислительных систем. - М.: МГТУ им. Н. Э. Баумана, 2008.
  • Корнеев В.В. Вычислительные системы. – М.: Гелиос АРВ, 2004. – 512 с.
  • Степаненко С.А. Мультипроцессорные среды суперЭВМ. Масштабирование эффективности. – М.: ФИЗМАТЛИТ, 2016. – 312 с.
  • Столлингс В. Структурная организация и архитектура компьютерных систем. - М.: Вильямс, 2002
  • John L. Hennessy, David A. Patterson. Computer Architecture: A Quantitative Approach, 5 ed., Morgan Kaufmann, 2011
  • Randal E. Bryant, David R. O'Hallaron. Computer Systems: A Programmer's Perspective. - Addison-Wesley, 2010
  • Denis Bakhvalov. Performance Analysis and Tuning on Modern CPUs: Squeeze the last bit of performance from your application, 2020

Параллельные вычислительные технологии (ПВТ)

Весенний семестр 2026

17 лекций, 17 практических занятий, зачет

Зачет

  • TBD

Материалы лекций

Практические работы

Лабораторные работы выполняются в операционной системе GNU/Linux на языках программирования C/C++.

Материалы по курсу

Параллельные вычисления

  • Эндрюс Г. Основы многопоточного, параллельного и распределенного программирования. - М.: Вильямс, 2003.
  • Лацис А. Параллельная обработка данных. - М.: Академия, 2010.
  • Расс Миллер, Лоренс Боксер. Последовательные и параллельные алгоритмы. - М.: Бином, 2009
  • Ian Foster. Designing and Building Parallel Programs

Многопоточное программирование

  • Уильямс Э. Параллельное программирование на С++ в действии. Практика разработки многопоточных программ. - М.: ДМК Пресс, 2012.
  • Шамим Эхтер, Джейсон Робертс. Многоядерное программирование. - СПб.: Питер, 2010.
  • Maurice Herlihy, Nir Shavit. The Art of Multiprocessor Programming, Morgan Kaufmann, 2012
  • Darryl Gove. Multicore Application Programming: for Windows, Linux, and Oracle Solaris, Addison-Wesley, 2010
  • Richard H. Carver, Kuo-Chung Tai. Modern Multithreading : Implementing, Testing, and Debugging Multithreaded Java and C++/Pthreads/Win32 Programs, Wiley-Interscience, 2005
  • Gadi Taubenfeld. Synchronization Algorithms And Concurrent Programming, Pearson, 2006

OpenMP

  • http://www.openmp.org/mp-documents/OpenMP4.0.0.pdf OpenMP 4.0 Specification
  • Антонов А.С. Параллельное программирование с использованием технологии OpenMP. - М.: МГУ, 2009
  • Алексей Колосов, Андрей Карпов, Евгений Рыжков. 32 подводных камня OpenMP при программировании на Си++, 2009
  • Антонов А.С. Технологии параллельного программирования MPI и OpenMP. - М.: МГУ, 2012
  • Tim Mattson. A “Hands-on” Introduction to OpenMP
  • Advanced OpenMP Topics // NAS Webinar, 2012

Архитектура вычислительных систем

  • Хорошевский В.Г. Архитектура вычислительных систем. - М.: МГТУ им. Н. Э. Баумана, 2008.
  • Корнеев В.В. Вычислительные системы. – М.: Гелиос АРВ, 2004. – 512 с.
  • Степаненко С.А. Мультипроцессорные среды суперЭВМ. Масштабирование эффективности. – М.: ФИЗМАТЛИТ, 2016. – 312 с.
  • Столлингс В. Структурная организация и архитектура компьютерных систем. - М.: Вильямс, 2002
  • John L. Hennessy, David A. Patterson. Computer Architecture: A Quantitative Approach, 5 ed., Morgan Kaufmann, 2011
  • Randal E. Bryant, David R. O'Hallaron. Computer Systems: A Programmer's Perspective. - Addison-Wesley, 2010
  • Denis Bakhvalov. Performance Analysis and Tuning on Modern CPUs: Squeeze the last bit of performance from your application, 2020

Компиляторные технологии

Осенний семестр, 4 курс, 8 лекций, 17 практических занятий, экзамен

Материалы лекций и практик

Практические занятия

  • Задание 1. Calculator (deadline: 14.09.2025)
  • Задание 2. Frontend-компилятора: драйвер, лексический анализатор, синтаксический анализ (рекурсивный спуск, построение AST), семантический анализ (deadline: 04.10.2025)
  • Задание 3. LLVM IR: трансляция языковых конструкций в IR (deadline: 12.10.2025)
  • Задание 4. Трансляция конструкций учебного языка в LLVM IR (deadline: 01.11.2025)
  • Задание 5. Трансляция выражений работы с массивами и структурами в LLVM IR (deadline: 16.11.2025)
  • Задание 6. LLVM Plugin API (deadline: 23.11.2025)
  • Задание 7. LLVM JIT (deadline: 07.12.2025)

Экзамен

Программирование встраиваемых систем

Весенний семестр, 3 курс, 15 лекций, 15 практических занятий (5 групп), экзамен

Лекции

Практические занятия

  • Занятие 1. Сборка средств-кросс компиляции (building a cross-compiling toolchain)
  • Занятие 2. Загрузчик U-Boot (bootloader U-Boot)
  • Занятие 3. Кросс-компиляция ядра Linux (fetching kernel + cross-compiling)
  • Занятие 4. Формирование корневой ФС на базе BusyBox (embedded system with BusyBox)
  • Занятие 5. Файлы устройств, загрузка с блочного устройства (accessing hardware devices + filesystems)
  • Занятие 6. Кросс-компиляция приложения
  • Занятие 7. Защита
  • Занятие 8. Формирование прошивки системой сборки Buildroot (using a build system Buildroot)
  • Занятие 9. Защита
  • Занятие 10. Разработка модуля ядра Linux
  • Занятие 11. Защита
  • Занятие 12. Структура драйвера сетевого контроллера Ethernet
  • Занятие 13. Защита
  • Занятие 14. Структура драйвера WiFi-адаптера
  • Занятие 15. Защита

Материалы

Архитектурно-ориентированная оптимизация кода

Курс повышения квалификации по заказу предприятия (~ 5 дней).

Keywords

Intel64, ILP/TLP, DRAM/SRAM,
k-way set-associative cache, cache line, cache hit,
cache misprediction, false sharing, struct splitting,
AoS-SoA, MESIF,
branch prediction, branchless code, data hazard, loop unrolling,
out-of-order execution, code vectorization (avx2, avx-512),
TLB, huge pages, THP, NUMA, Linux memory affinity,
first touch policy, NUMA balancing, NUMAStat, Intel TMAM, perf, toplev,
MPI, MPI RMA, MPI Hybrid MPI + OpenMP, MPI collective operations.

Материалы лекций и практик

  • Структурная организация процессоров с архитектурой Intel 64. Понятие архитектуры и микроархитектуры процессора. Уровни параллелизма ILP/TLP [Download]
  • Организация оперативной памяти (DRAM/SRAM, многоканальность). Cбор информации о конфигурации целевой системы GNU/Linux [Download]
  • Кеш память процессора. Методы отображения адресов. Множественноассоциативное отображение. Протоколы поддержания согласованности кеш-памяти (Intel 64). Атомарные операции x86-64. Оптимизация локальности обращения к памяти. Оптимизация кеширования структур данных. Анализ эффективности использования кешпамяти с помощью perf [Download]
  • Оптимизация кода для суперскалярного ядра Intel 64. Оптимизация предсказания ветвлений (branch prediction). Устранение ветвлений (branchless code). Оптимизация загрузки суперскалярного ядра: конфликты данных (data hazards), loop unrolling, внеочередное выполнение инструкций. Векторизация кода (AVX2/AVX512) [Download]
  • Оптимизация трансляции адресов (TLB). Большие страницы памяти (huge pages, transparent huge pages). Выделение больших страниц памяти и использование в программах [Download]
  • Архитектура NUMA-систем. Адресное пространство процесса и политики выделения памяти GNU/Linux (memory affinity). Политики выделения физических страниц памяти с NUMA-узлов (first touch policy). Мониторинг загрузки и автоматическая балансировка NUMAузлов (NUMATop, vmstat) [Download]
  • Методика анализа производительности Intel Top-Down Microarchitecture Analysis Method [Download]
  • Масштабируемость интерфейса MPI и его реализаций [Download]
  • Гибридные параллельные программы MPI+OpenMP. Оптимизация обменов с использованием разделяемой памяти вычислительных узлов (MPI + MPI 3.0 RMA Shared Memory) [Download]
  • Коллективные операции MPI (подходы к оптимизации) [Download]

Курс может быть адаптирован под интересы целевого предприятия/компании