Лукин Иван. Технология SEQ-MPI. Сумма элементов вектора. Вариант 1.#29
Лукин Иван. Технология SEQ-MPI. Сумма элементов вектора. Вариант 1.#29allnes merged 52 commits intolearning-process:masterfrom
Conversation
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## master #29 +/- ##
==========================================
+ Coverage 94.03% 94.68% +0.65%
==========================================
Files 15 17 +2
Lines 486 546 +60
Branches 181 199 +18
==========================================
+ Hits 457 517 +60
Partials 29 29 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
| } | ||
|
|
||
| bool LukinIElemVecSumMPI::ValidationImpl() { | ||
| return true; |
| | mpi | 4 | 0.09 | 0.22 | 5.0% | | ||
| | mpi | 8 | 0.1 | 0.2 | 2.5% | | ||
|
|
||
| Это тесты производительности на векторе из 500 млн элементов. Видно, что расходы на коммуникацию многократно превысили время счета. Также стоит отметить, что тест на 8 процессах не удалось осуществить, что подтверждает выводы о серьезных затратах на Scatterv. |
| } | ||
|
|
||
| std::vector<int> sendcounts(proc_count); | ||
| std::vector<int> offsets(proc_count); |
There was a problem hiding this comment.
Why do you need offsets calculation along with using Scatterv for data distribution?
There was a problem hiding this comment.
Считал, что задача подразумевает, что данные нужно распределить от корня ко всем процессам, а scatterv был удобен для этого. Сейчас реализация изменена с учетом того, что GetInput доступен всем процессам сразу.
There was a problem hiding this comment.
Если данные все же нужно было распределять, а спросили вы, чтобы меня проверить, то ответ - потому что у меня неравномерное распределение данных в общем случае, с этим можно ознакомиться в отчете, я об этом писал. Можно было бы дополнить вектор нейтральными для сложения элементами и использовать Scatter, но я выбрал Scatterv по его непосредственному назначению. Жду обратной связи, если мне нужно откатиться к предыдущей реализации.
There was a problem hiding this comment.
Откатился к предыдущей реализации и сделал так, чтобы GetInput был доступен только на корневом процессе, как того и требует задача. Также учел и другие ваши замечания.
| - Hardware/OS: Intel I5-13420H, 8 cores, 16GB RAM, Win10 OS | ||
| - Toolchain: Microsoft Visual C++ (MSVC), MSBuild 17.14.23, Release | ||
| - Environment: PPC_NUM_PROC | ||
| - Data: Вектор на 20'000'000 элементов, элементы составляют арифметическую прогрессию от 1 до vector.size с шагом 1 |
There was a problem hiding this comment.
I don't see any results for 20M elements
…earning-process#29) <!-- Требования к названию pull request: "<Фамилия> <Имя>. Технология <TECHNOLOGY_NAME:SEQ|OMP|TBB|STL|MPI>. <Полное название задачи>. Вариант <Номер>" --> ## Описание <!-- Пожалуйста, предоставьте подробное описание вашей реализации, включая: - основные детали решения (описание выбранного алгоритма) - применение технологии параллелизма (если применимо) --> Была сделана задача параллелизма на примере задачи вычисления суммы элементов вектора. - **Задача**: _Сумма элементов вектора_ - **Вариант**: _1_ - **Технология**: _SEQ, MPI_ - **Описание**: SEQ: Последовательно проходим по всему вектору и суммируем все его элементы с помощью `std::accumulate`. MPI: Параллельный алгоритм реализует распределенное суммирование элементов вектора с использованием MPI. Корневой процесс распределяет данные между всеми процессами с помощью операции `Scatterv`, обеспечивая равномерное распределение элементов с учетом возможного остатка (Всем по целой части, остаток распределяется между первыми `reminder` процессами). Каждый процесс независимо вычисляет локальную сумму своих элементов. Затем с помощью операции `Allreduce` все частичные суммы складываются, и итоговый результат становится доступен всем процессам одновременно. Для случая, когда количество процессов превышает размер вектора, алгоритм предусматривает специальную обработку, где только root-процесс выполняет последовательное суммирование, а результат рассылается остальным процессам через `Broadcast` --- ## Чек-лист <!-- Пожалуйста, убедитесь, что следующие пункты выполнены **до** отправки 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 и получению нулевого балла за соответствующую задачу. -->
…earning-process#29) <!-- Требования к названию pull request: "<Фамилия> <Имя>. Технология <TECHNOLOGY_NAME:SEQ|OMP|TBB|STL|MPI>. <Полное название задачи>. Вариант <Номер>" --> ## Описание <!-- Пожалуйста, предоставьте подробное описание вашей реализации, включая: - основные детали решения (описание выбранного алгоритма) - применение технологии параллелизма (если применимо) --> Была сделана задача параллелизма на примере задачи вычисления суммы элементов вектора. - **Задача**: _Сумма элементов вектора_ - **Вариант**: _1_ - **Технология**: _SEQ, MPI_ - **Описание**: SEQ: Последовательно проходим по всему вектору и суммируем все его элементы с помощью `std::accumulate`. MPI: Параллельный алгоритм реализует распределенное суммирование элементов вектора с использованием MPI. Корневой процесс распределяет данные между всеми процессами с помощью операции `Scatterv`, обеспечивая равномерное распределение элементов с учетом возможного остатка (Всем по целой части, остаток распределяется между первыми `reminder` процессами). Каждый процесс независимо вычисляет локальную сумму своих элементов. Затем с помощью операции `Allreduce` все частичные суммы складываются, и итоговый результат становится доступен всем процессам одновременно. Для случая, когда количество процессов превышает размер вектора, алгоритм предусматривает специальную обработку, где только root-процесс выполняет последовательное суммирование, а результат рассылается остальным процессам через `Broadcast` --- ## Чек-лист <!-- Пожалуйста, убедитесь, что следующие пункты выполнены **до** отправки 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: Последовательно проходим по всему вектору и суммируем все его элементы с помощью
std::accumulate.MPI: Параллельный алгоритм реализует распределенное суммирование элементов вектора с использованием MPI. Корневой процесс распределяет данные между всеми процессами с помощью операции
Scatterv, обеспечивая равномерное распределение элементов с учетом возможного остатка (Всем по целой части, остаток распределяется между первымиreminderпроцессами). Каждый процесс независимо вычисляет локальную сумму своих элементов. Затем с помощью операцииAllreduceвсе частичные суммы складываются, и итоговый результат становится доступен всем процессам одновременно. Для случая, когда количество процессов превышает размер вектора, алгоритм предусматривает специальную обработку, где только root-процесс выполняет последовательное суммирование, а результат рассылается остальным процессам черезBroadcastЧек-лист
<фамилия>_<первая_буква_имени>_<короткое_название_задачи>clang-formatлокально в моем форке (нет ошибок форматирования)clang-tidyлокально в моем форке (нет предупреждений/ошибок)nesterov_a_vector_sum), а не вmaster