Skip to content

Conversation

@userskins
Copy link
Contributor

Описание

  • Задача: Поразрядная сортировка для вещественных чисел (тип double) с простым слиянием
  • Вариант: 20
  • Технология: SEQ, MPI
  • Краткое описание: Реализованы последовательный и параллельный алгоритмы поразрядной сортировки (LSD Radix Sort) для вещественных чисел типа double. Последовательный алгоритм использует побитовые преобразования для корректной обработки формата IEEE 754 и оптимизирован для работы in-place (без дополнительных буферов). Параллельный алгоритм реализует схему декомпозиции данных с использованием MPI: исходный массив распределяется между процессами, сортируется локально, после чего выполняется параллельное древовидное слияние (Tree Merge). Реализована оптимизация памяти (Zero-allocation merge) для минимизации накладных расходов при передаче данных. Написаны функциональные (проверка на отрицательных числах, нулях, отсортированных массивах) и производительные тесты. Оба алгоритма успешно проходят функциональные тесты. Тесты производительности на 25 млн элементов демонстрируют эффект "Memory Wall" для задач линейной сложности $O(N)$ на общей памяти: масштабируемость ограничена пропускной способностью шины, с максимальной эффективностью на малом числе процессов.

Чек-лист

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

@codecov-commenter
Copy link

codecov-commenter commented Jan 2, 2026

Codecov Report

❌ Patch coverage is 97.56098% with 2 lines in your changes missing coverage. Please review.
✅ Project coverage is 16.11%. Comparing base (92b24d3) to head (9549262).
⚠️ Report is 109 commits behind head on master.

Files with missing lines Patch % Lines
tasks/gusev_d_radix_double/mpi/src/ops_mpi.cpp 95.23% 0 Missing and 2 partials ⚠️

❗ There is a different number of reports uploaded between BASE (92b24d3) and HEAD (9549262). Click for more details.

HEAD has 18 uploads less than BASE
Flag BASE (92b24d3) HEAD (9549262)
19 1
Additional details and impacted files
@@             Coverage Diff             @@
##           master     #279       +/-   ##
===========================================
- Coverage   94.03%   16.11%   -77.92%     
===========================================
  Files          15      189      +174     
  Lines         486     7278     +6792     
  Branches      181     2817     +2636     
===========================================
+ Hits          457     1173      +716     
- Misses          0     6028     +6028     
- Partials       29       77       +48     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@allnes
Copy link
Member

allnes commented Jan 2, 2026

просьба увеличить покрытие кода - сейчас 0%

@userskins
Copy link
Contributor Author

@allnes я ещё начиная с первой лабы на протяжении месяца пытался покрыть код хоть где-то хоть как-то и проверял локально -- я искренне не понимаю какие траблы произошли, что всё, кроме покрытия ок, но порой даже локально файлы не появляются в gcov

@allnes
Copy link
Member

allnes commented Jan 3, 2026

@userskins у вас ни один тест не запустился, поэтому у вас 0, вы не правильно написали конфигурацию теста, упущено
const auto kPerfTestName = GusevDRadixDoubleFuncTests::PrintFuncTestName<GusevDRadixDoubleFuncTests>;
просьба локально перепроверить

@userskins
Copy link
Contributor Author

@allnes помогло, спасибо большое! покручу ещё для прошлых работ

- Используются массивы смещений (displs) и размеров (send_counts) для обработки случая, когда $N \% P \neq 0$.
- **Коммуникация**:
- Рассылка (Scatter): MPI_Scatterv распределяет исходный массив по процессам.
- Сбор (Gather): MPI_Gatherv собирает локально отсортированные массивы обратно на Rank 0.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Where can I find this in your implementation?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

В отчёте в разделе 4 "Параллельная схема" описан общий принцип алгоритма с простым слиянием. Однако в разделе 5 "Реализация" я уточнил, что для повышения эффективности сбор данных был заменен на оптимизированный Tree Merge, чтобы избежать аллокации лишней памяти на главном узле. Нужные строчки кода находятся в ops_mpi.cpp

Массивы смещений и размеров:

 std::vector<int> send_counts(size);
 std::vector<int> displs(size);

Рассылка:

MPI_Scatterv(GetInput().data(), send_counts.data(), displs.data(), MPI_DOUBLE, local_data.data(), send_counts[rank], MPI_DOUBLE, 0, MPI_COMM_WORLD);

Улучшенный сбор:

while (step < size) {
    if (rank % (2 * step) == 0) {
      int source = rank + step;
      if (source < size) {
        int recv_count = 0;
        MPI_Recv(&recv_count, 1, MPI_INT, source, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);

        size_t current_size = local_data.size();
        local_data.resize(current_size + recv_count);

        MPI_Recv(local_data.data() + current_size, recv_count, MPI_DOUBLE, source, 0, MPI_COMM_WORLD,
                 MPI_STATUS_IGNORE);

        std::inplace_merge(local_data.begin(), local_data.begin() + static_cast<std::ptrdiff_t>(current_size),
                           local_data.end());
      }
    } else if (rank % (2 * step) == step) {
      int dest = rank - step;
      int count = static_cast<int>(local_data.size());

      MPI_Send(&count, 1, MPI_INT, dest, 0, MPI_COMM_WORLD);
      MPI_Send(local_data.data(), count, MPI_DOUBLE, dest, 0, MPI_COMM_WORLD);

      local_data.clear();
      local_data.shrink_to_fit();
      break;
    }
    step *= 2;
  }

Вместе с комментарием отправляю коммит с немного подправленным отчётом (за основу брал отчёт с прошлой лабы и немного всё намешалось)

return true;
}

// NOLINTNEXTLINE(readability-function-cognitive-complexity)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please, remove all NOLINTs

# Звезда
- Студент: Гусев Дмитрий Алексеевич, 3823Б1ФИ1
- Технология: SEQ, MPI
- Вариант: 8
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

8 or 20?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Отчёт поправил

@userskins userskins requested a review from aobolensk January 3, 2026 14:56
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.

4 participants