АНАЛИЗ СОВРЕМЕННЫХ ИНСТРУМЕНТАЛЬНЫХ ЯЗЫКОВЫХ СРЕДСТВ ДЛЯ ПОИСКА И ПОСТРОЕНИЯ ЭФФЕКТИВНЫХ АСИНХРОННЫХ АЛГОРИТМОВ

АНАЛИЗ СОВРЕМЕННЫХ ИНСТРУМЕНТАЛЬНЫХ ЯЗЫКОВЫХ СРЕДСТВ ДЛЯ ПОИСКА И ПОСТРОЕНИЯ ЭФФЕКТИВНЫХ АСИНХРОННЫХ АЛГОРИТМОВ

Авторы публикации

Рубрика

Информационные технологии

Просмотры

29

Журнал

Журнал «Научный лидер» выпуск # 25 (278), Июнь ‘26

Поделиться

Была проведена теоретическая оценка производительности базовых алгоритмов, рассмотрены законы Амдала и Густафсана – Барсиса, а также учитывалась временная эффективность Рассмотрены примеры сортировки слиянием и бинарного поиска в среде C++. Предложены математические модели для оценки времени работы и затрат ресурсов компьютеров. Проведено тестирование и составлены результаты с реальностью. Показаны преимущества, недостатки при разных входных данных и показана неэффективность многопоточного бинарного поиска и предложены другие методы для оптимизации кода такие как работа с кэш -линией, SIMD слияние, использование более новых алгоритмов из C++17/20 версии.

ВВЕДЕНИЕ. Современные вычислительные системы включают несколько ядер или процессоров. В их основе лежать сложные и дорогостоящие аппаратные части, такие как L1, L2, L3 уровни кэша, SRAM память.

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

Проблемная область. Для точной оценки эффективности необходим в обширный инструментарий и глубокие знания в низкоуровневых механизмах работы. Классические модели, такие как закон Амдала или Густафсона – Барсиса не позволяют с достаточной степенью точности дать оценку времени работы алгоритма. Необходимо учитывать системные вызовы (создание потока, ожидание future), переключение контекста, а также загрузку процессора.

ЦЕЛЬ НАСТОЯЩЕЙ РАБОТЫ. Привести примеры алгоритмов и их асинхронных версий, оценить время работы. Разработать на основании их математическую модели. Реализовать последовательные и параллельные версии алгоритмов, измерить время выполнения для различных размеров данных и числа потоков, сопоставить с теоретическими моделями и сформулировать практические рекомендации.

МАТЕРИАЛ И МЕТОДЫ ИССЛЕДОВАНИЯ. Приведём классические законы, для описания параллельных вычислений:

Закон Амдала (1967) устанавливает предельное ускорение S(p) программы при фиксированном объёме данных:

где α – доля последовательного кода, – число процессоров. При p∞ ускорение стремится к 1/α, то есть даже бесконечное количество ядер не может ускорить программу более чем в 1/α раз.

Закон Густафсона (1988) учитывает возможность масштабирования задачи: с ростом числа процессоров увеличивается и размер входных данных. В такой постановке ускорение выражается как:

однако, данные модели полезны для теоретических оценок, для реальных случаев они не учитывают накладные расходы, и время создания потоков.

В языке C++ при использовании std::async с политикой std::launch::async создаётся новый поток для каждой задачи. Даже на современных системах создание потока занимает 1–2 мкс и требует выделения памяти под стек (обычно 1–8 Мбайт). При мелкой задаче затраты на создание потоков превышают выигрыш от параллельного выполнения.

В качестве примера можно рассмотреть стандартные алгоритмы сортировки.

Базовая последовательная сортировка слиянием (Merge Sort) имеет сложность O(log⁡ n). Её параллельная версия использует рекурсивное разделение массива. Для избежания излишнего дробления задач вводится порог (threshold): если размер подмассива меньше или равен порогу, сортировка выполняется последовательно.

Оптимальное значение порога, при котором эффективен однопоточный алгоритм, лежит между 300 до 2000 элементом, а также зависит от типа данных и архитектуры системы.

Для бинарного поиска создание отдельного потока на каждый рекурсивный вызов нецелесообразно из-за логарифмической сложности. Поэтому лучшим решением было разработать отдельный класс пула потоков, который переиспользует фиксированное число потоков. Задачи помещаются в очередь и распределяются между рабочими потоками. Использование класса распределяет задачи между заданным числом потоков, что снижает накладные расходы на создание потоков по сравнению с вызовом std::async для каждой подзадачи.

Математическая модель алгоритмов представлена в следующем виде

Последовательное время сортировки слиянием:

Параллельное время (приблизительная оценка):

Ускорение:

Для бинарного поиска последовательное время Tseq=⌈log2ntcomp, параллельное – с разбиением на сегментов даёт Tparγptsync+log2(n/p)tcomp, где γ – эмпирический коэффициент накладных расходов на разбиение (≈ 0,1). При любых входных данных у параллельного бинарного поиска, мы получаем заметное падение эффективности.

РЕЗУЛЬТАТЫ И ОБСУЖДЕНИЕ Эксперименты проводились на процессоре Intel Core i7-12700K (14 потоков, 8 физических ядер), частота 3,6 ГГц, ОС Ubuntu 22.04, компилятор g++ 11.3 с ключами -O3 -march=native. Для каждого размера массива и числа потоков выполнялось 10 запусков, результаты усреднены. Размер массива для сортировки выбран n=150000.

Таблица 1.

Сравнение ускорения сортировки слиянием

(потоков)

Tseq, мс

Tpar, мс

Реальное ускорение

Амдал (α=0,65)

Густафсон-Барсис

1

28,8

28,8

1,00

1,00

1,00

2

28,8

19,5

1,48

1,48

1,70

4

28,8

13,2

2,18

2,00

3,05

8

28,8

10,1

2,85

2,35

5,55

14

28,8

9,4

3,06

2,52

9,45

 

По результатам тестирования можно наблюдать, что реальное ускорение оценивается примерно в 3,06x при максимальном числе потоков. Для закона Амдала теоретические результаты дают оценку 2,52x и 9.45x для Густафсона – Барсиса, результаты имеют значительно отличаются от теоретических оценок. Параллельный бинарный поиск во всех экспериментах показал ускорение < 1, что делает данную реализацию абсолютно неэффективной.

ВЫВОДЫ. Параллельные алгоритмы эффективны далеко не для всех задач и требуют дополнительного анализа и тщательной разработки. Асинхронный алгоритм сортировки слиянием эффективен при размере входных данных размером более 10000 элементов. Максимальное ускорение составило 3,06× против 1,48× в нескольких потоках. Теоретические оценки не являются точным прогнозом стабильности из-за дополнительных накладных расходов и ресурсов. Бинарный поиск не улучшил свои показатели при многопоточной работе.

ПУТИ ДАЛЬНЕЙШЕГО РАЗВИТИЯ. Необходимо провести дополнительный анализ и разработать адаптивный порог переключения (зависящий также от числа потоков и размера кэш-памяти), необходимо учитывать паттерны доступа к кэш-памяти процессора. Изучить и использовать SIMD-инструкций (AVX2) для ускорения последовательного слияния, осуществить переход на более лёгкие средства параллелизма: std::execution::par (C++17) и std::jthread (C++20), а также провести анализ кэш промахов L3 кэша процессора.

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

  1. Williams A. C++ Concurrency in Action, 2nd ed. — Manning Publications, 2019. — 592 p. — ISBN 978-1617294693
  2. Stroustrup B. The C++ Programming Language, 4th ed. — Addison-Wesley, 2013. — 1347 p. — ISBN 978-0321563842
  3. Josuttis N. M. The C++ Standard Library: A Tutorial and Reference, 2nd ed. — Addison-Wesley, 2012. — 1120 p. — ISBN 978-0321623218
  4. Meyers S. Effective Modern C++: 42 Specific Ways to Improve Your Use of C++11 and C++14. — O'Reilly Media, 2014. — 334 p. — ISBN 978-1491903995
  5. Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К. Алгоритмы: построение и анализ = Introduction to Algorithms / Под ред. И. 6.В. Красикова. — 2-е изд. — М.: Вильямс, 2005. — 1296 с. — ISBN 5-8459-0857-4
  6. Левитин А. В. Алгоритмы. Введение в разработку и анализ. — М.: Вильямс, 2006. — 576 с. — ISBN 978-5-8459-0987-9
  7. Кнут Д. Э. Искусство программирования, том 3: Сортировка и поиск, 3-е изд. — М.: Вильямс, 2020. — 832 с. — ISBN 978-5-8459-1821-5
  8. Антонов А. Под законом Амдала // Компьютерра. — 11.02.2002. — № 430. — URL: https://www.computerra.ru/2002/430/15838/ (дата обращения: 01.06.2026)
  9. Gustafson J. L. Reevaluating Amdahl's Law // Communications of the ACM. — 1988. — Vol. 31, No. 5. — P. 532–533. — DOI: 10.1145/42411.42415
Справка о публикации и препринт статьи
предоставляется сразу после оплаты
Прием материалов
c по
Остался последний день
Размещение электронной версии
Загрузка материалов в elibrary
Публикация за 24 часа
Узнать подробнее
Акция
Cкидка 20% на размещение статьи, начиная со второй
Бонусная программа
Узнать подробнее