Skip to content

Вотинцев Дмитрий. Технология TBB. Поразрядная сортировка для целых чисел с простым слиянием. Вариант 17.#668

Open
DimaVotincev wants to merge 7 commits intolearning-process:masterfrom
DimaVotincev:votincev_d_radixmerge_sort_tbb
Open

Conversation

@DimaVotincev
Copy link
Copy Markdown
Contributor

Описание

  • Задача: Поразрядная сортировка для целых чисел с простым слиянием.
  • Вариант: 17
  • Технология: TBB
  • Описание :
    Алгоритм реализует гибридную сортировку на основе библиотеки Intel TBB (Threading Building Blocks): рекурсивное параллельное разделение данных (как в сортировке слиянием) с переключением на локальную поразрядную сортировку при достижении порога размера блока. Поразрядная сортировка использует 10 корзин (цифры от 0 до 9) и работает с десятичными разрядами (основание 10). Для корректной обработки отрицательных чисел выполняется нормализация – сдвиг всего диапазона значений в неотрицательную область.

Основные этапы (TBB):

  1. Параллельное вычисление минимума: Используется tbb::parallel_reduce для нахождения минимального значения в массиве. Каждый поток обрабатывает свой непрерывный блок (разбиение через tbb::blocked_range), затем результаты объединяются редукцией по операции std::min.

  2. Параллельная нормализация: Посредством tbb::parallel_for каждый элемент преобразуется (вычитается минимум), становясь неотрицательным числом типа uint32_t. Это необходимо для корректной работы поразрядной сортировки.

  3. Рекурсивная параллельная сортировка (ParallelRadixMergeSort):

    • Если размер блока (right - left) не превышает grain_size = 4096, выполняется последовательная LocalRadixSort.
    • Иначе блок делится пополам, и две половинки сортируются параллельно с помощью tbb::parallel_invoke.
    • После завершения сортировки половинок выполняется слияние (Merge) из временного буфера обратно в основной массив.
  4. Локальная поразрядная сортировка (LocalRadixSort): LSD Radix Sort (Least Significant Digit) по основанию 10. Цифры извлекаются из чисел, и элементы распределяются по 10 корзинам последовательно, от младшего разряда к старшему.

  5. Параллельное восстановление диапазона: С помощью tbb::parallel_for каждый элемент переводится обратно в исходный диапазон (прибавляется ранее вычтенный минимум). Результат помещается в выходной вектор.

Особенности реализации:

  • Тип данных: int32_t → нормализация → uint32_t → сортировка → обратное преобразование.
  • Основание поразрядной сортировки: 10 (десятичные цифры).
  • Схема параллелизма: рекурсивное разделение задач (divide-and-conquer) через tbb::parallel_invoke.
  • Порог переключения (grain_size): 4096 элементов – при меньшем размере блока используется последовательная поразрядная сортировка.
  • Рабочие буферы: временный буфер temp_buffer того же размера, что и исходный массив, используется для слияний.
  • Планировщик TBB: автоматически распределяет задачи по доступным потокам, балансируя нагрузку.

Чек-лист

  • Статус CI: Все CI-задачи (сборка, тесты, генерация отчёта) успешно проходят на моей ветке в моем форке
  • Директория и именование задачи: Я создал директорию с именем <фамилия>_<первая_буква_имени>_<короткое_название_задачи>
  • Полное описание задачи: Я предоставил полное описание задачи в теле pull request
  • clang-format: Мои изменения успешно проходят clang-format локально в моем форке (нет ошибок форматирования)
  • clang-tidy: Мои изменения успешно проходят clang-tidy локально в моем форке (нет предупреждений/ошибок)
  • Функциональные тесты: Все функциональные тесты успешно проходят локально на моей машине
  • Тесты производительности: Все тесты производительности успешно проходят локально на моей машине
  • Ветка: Я работаю в ветке, названной точно так же, как директория моей задачи
    (например, nesterov_a_vector_sum), а не в master
  • Правдивое содержание: Я подтверждаю, что все сведения, указанные в этом pull request, являются точными и
    достоверными

@DimaVotincev
Copy link
Copy Markdown
Contributor Author

DimaVotincev commented Apr 16, 2026

Билд упал, по логам посмотрел, упала не моя работа.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant