Гасенин Леонид. Технология SEQ-MPI. Проверка лексикографической упорядоченности двух строк. Вариант 26.#47
Conversation
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## master #47 +/- ##
==========================================
+ Coverage 94.03% 94.85% +0.82%
==========================================
Files 15 17 +2
Lines 486 564 +78
Branches 181 218 +37
==========================================
+ Hits 457 535 +78
Partials 29 29 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
|
gonna get some rest rn |
| GetInput() = in; | ||
| GetOutput() = 0; | ||
| } | ||
|
|
There was a problem hiding this comment.
ValidationImpl ограничивает длину строк 10 000 000, тогда как performance-тест генерирует по 100 000 000 символов. Валидация вернет false и задача не запустится, перф-тест заведомо упадет. Нужно либо поднять лимит в валидации до используемых размеров, либо уменьшить входы в тесте/описании, чтобы ограничения и тестовые данные совпадали.
|
roger that, i'll fix it as soon as possible |
|
done |
|
well now everythin is definitely ready |
| return true; | ||
| } | ||
|
|
||
| bool GaseninLLexDifMPI::RunImpl() { |
There was a problem hiding this comment.
The string is not being sent from rank 0 to other ranks
There was a problem hiding this comment.
so ive checked the code and believe the current implementation in GaseninLLexDifMPI::RunImpl() correctly handles passed strings, including empty strings.
first of all, all processes get the actual string lengths (lengths[0] and lengths[1]) via MPI_Bcast of the lengths array.
after that all processes except rank 0 call str.resize(length). if the resulting length is zero, the local string is immediately set to empty and correctly initialized.
after all of that the basic MPI_Bcast for data strings (str.data()) only proceeds if the length is > 0. If the length is 0, no data transfer is necessary and the string is already synchronized (empty) due to a previous call to resize(0).
thus for an empty string (length = 0), no data transfer is required, since its state (being empty) is already synchronized.
if im wrong, please explain my mistake in more detail because I have no idea what's wrong there.
There was a problem hiding this comment.
Sure, but are you sure that the whole string is required on each process?
There was a problem hiding this comment.
ok. gonna fix that.
| lengths[1] = long_str2.length(); | ||
| } | ||
|
|
||
| MPI_Bcast(lengths.data(), 2, MPI_UINT64_T, 0, MPI_COMM_WORLD); // NOLINT |
…доченности двух строк. Вариант 26. (learning-process#47) ## Описание - **Задача**: Проверка лексикографической упорядоченности двух строк. - **Вариант**: 26. - **Технология**: SEQ-MPI - **Описание**: Реализовано лексикографическое сравнение двух строк в последовательном (SEQ) и параллельном (MPI) форматах. **Последовательная версия (SEQ)** (`ops_seq.cpp`) является эталонной: она выполняет посимвольное сравнение, прерываясь при первом различии, и использует сравнение длин для обработки случаев, когда одна строка является префиксом другой. **Параллельная версия (MPI)** (`ops_mpi.cpp`) использует **декомпозицию данных**: * Общий диапазон сравнения (максимальная длина строк) делится на блоки по числу MPI-процессов * Каждый процесс ищет **первое различие** только в своем блоке, возвращая его позицию (`local_diff_pos`) и результат (`local_result`) * Для определения **глобально первой** позиции различия и сбора результата используется двухэтапный паттерн **редукции** (`MPI_Allreduce`): сначала с операцией `MPI_MIN` для нахождения минимальной позиции, затем с операцией `MPI_SUM` для сбора результата от "победившего" процесса * Корректно обрабатываются граничные случаи: пустые строки, строки разной длины, и строки с различием в середине или конце **Проведено сравнение производительности, которое, как указано в отчете, дает **ускорение до 3 раз** для больших входных данных. Алгоритм корректно обрабатывает все входные данные и полностью совпадает с последовательной реализацией.** ## Чек-лист <!-- Пожалуйста, убедитесь, что следующие пункты выполнены **до** отправки pull request'а и запроса его ревью: --> - [x] **Статус CI**: Все CI-задачи (сборка, тесты, генерация отчёта) успешно проходят на моей ветке в моем форке - [x] **Директория и именование задачи**: Я создал директорию с именем `<фамилия>_<первая_буква_имени>_<короткое_название_задачи>` - [x] **Полное описание задачи**: Я предоставил полное описание задачи в теле pull request - [x] **clang-format**: Мои изменения успешно проходят `clang-format` локально в моем форке (нет ошибок форматирования) - [x] **clang-tidy**: Мои изменения успешно проходят `clang-tidy` локально в моем форке (нет предупреждений/ошибок) - [x] **Функциональные тесты**: Все функциональные тесты успешно проходят локально на моей машине - [x] **Тесты производительности**: Все тесты производительности успешно проходят локально на моей машине - [x] **Ветка**: Я работаю в ветке, названной точно так же, как директория моей задачи (например, `nesterov_a_vector_sum`), а не в `master` - [x] **Правдивое содержание**: Я подтверждаю, что все сведения, указанные в этом pull request, являются точными и достоверными <!-- ПРИМЕЧАНИЕ: Ложные сведения в этом чек-листе могут привести к отклонению PR и получению нулевого балла за соответствующую задачу. -->
…доченности двух строк. Вариант 26. (learning-process#47) ## Описание - **Задача**: Проверка лексикографической упорядоченности двух строк. - **Вариант**: 26. - **Технология**: SEQ-MPI - **Описание**: Реализовано лексикографическое сравнение двух строк в последовательном (SEQ) и параллельном (MPI) форматах. **Последовательная версия (SEQ)** (`ops_seq.cpp`) является эталонной: она выполняет посимвольное сравнение, прерываясь при первом различии, и использует сравнение длин для обработки случаев, когда одна строка является префиксом другой. **Параллельная версия (MPI)** (`ops_mpi.cpp`) использует **декомпозицию данных**: * Общий диапазон сравнения (максимальная длина строк) делится на блоки по числу MPI-процессов * Каждый процесс ищет **первое различие** только в своем блоке, возвращая его позицию (`local_diff_pos`) и результат (`local_result`) * Для определения **глобально первой** позиции различия и сбора результата используется двухэтапный паттерн **редукции** (`MPI_Allreduce`): сначала с операцией `MPI_MIN` для нахождения минимальной позиции, затем с операцией `MPI_SUM` для сбора результата от "победившего" процесса * Корректно обрабатываются граничные случаи: пустые строки, строки разной длины, и строки с различием в середине или конце **Проведено сравнение производительности, которое, как указано в отчете, дает **ускорение до 3 раз** для больших входных данных. Алгоритм корректно обрабатывает все входные данные и полностью совпадает с последовательной реализацией.** ## Чек-лист <!-- Пожалуйста, убедитесь, что следующие пункты выполнены **до** отправки pull request'а и запроса его ревью: --> - [x] **Статус CI**: Все CI-задачи (сборка, тесты, генерация отчёта) успешно проходят на моей ветке в моем форке - [x] **Директория и именование задачи**: Я создал директорию с именем `<фамилия>_<первая_буква_имени>_<короткое_название_задачи>` - [x] **Полное описание задачи**: Я предоставил полное описание задачи в теле pull request - [x] **clang-format**: Мои изменения успешно проходят `clang-format` локально в моем форке (нет ошибок форматирования) - [x] **clang-tidy**: Мои изменения успешно проходят `clang-tidy` локально в моем форке (нет предупреждений/ошибок) - [x] **Функциональные тесты**: Все функциональные тесты успешно проходят локально на моей машине - [x] **Тесты производительности**: Все тесты производительности успешно проходят локально на моей машине - [x] **Ветка**: Я работаю в ветке, названной точно так же, как директория моей задачи (например, `nesterov_a_vector_sum`), а не в `master` - [x] **Правдивое содержание**: Я подтверждаю, что все сведения, указанные в этом pull request, являются точными и достоверными <!-- ПРИМЕЧАНИЕ: Ложные сведения в этом чек-листе могут привести к отклонению PR и получению нулевого балла за соответствующую задачу. -->
Описание
Реализовано лексикографическое сравнение двух строк в последовательном (SEQ) и параллельном (MPI) форматах.
Последовательная версия (SEQ) (
ops_seq.cpp) является эталонной: она выполняет посимвольное сравнение, прерываясь при первом различии, и использует сравнение длин для обработки случаев, когда одна строка является префиксом другой.Параллельная версия (MPI) (
ops_mpi.cpp) использует декомпозицию данных:local_diff_pos) и результат (local_result)MPI_Allreduce): сначала с операциейMPI_MINдля нахождения минимальной позиции, затем с операциейMPI_SUMдля сбора результата от "победившего" процессаПроведено сравнение производительности, которое, как указано в отчете, дает ускорение до 3 раз для больших входных данных. Алгоритм корректно обрабатывает все входные данные и полностью совпадает с последовательной реализацией.
Чек-лист
<фамилия>_<первая_буква_имени>_<короткое_название_задачи>clang-formatлокально в моем форке (нет ошибок форматирования)clang-tidyлокально в моем форке (нет предупреждений/ошибок)nesterov_a_vector_sum), а не вmaster