-
Notifications
You must be signed in to change notification settings - Fork 169
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Седова Ольга. Задача 2. Вариант 16. Ленточная вертикальная схема умножения матрицы на вектор #386
Седова Ольга. Задача 2. Вариант 16. Ленточная вертикальная схема умножения матрицы на вектор #386
Conversation
boost::mpi::broadcast(world, input_matrix_1, 0); | ||
boost::mpi::broadcast(world, input_vector_1, 0); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sending the entire matrix A to all processes is not efficient
You said that you've fixed it, but you did not
@allnes комментарии Сергея исправлены, он их проверил и поставил апрув |
TEST(sedova_o_vertical_ribbon_scheme_mpi, distribution1) { | ||
int rows_ = 5; | ||
int cols_ = 3; | ||
int count_proc = 5; | ||
std::vector<int> proc_(count_proc, 0); | ||
std::vector<int> off(count_proc, 0); | ||
if (count_proc > rows_) { | ||
for (int i = 0; i < rows_; ++i) { | ||
off[i] = i * cols_; | ||
proc_[i] = cols_; | ||
} | ||
for (int i = rows_; i < count_proc; ++i) { | ||
off[i] = -1; | ||
proc_[i] = 0; | ||
} | ||
} else { | ||
int count_proc_ = rows_ / count_proc; | ||
int surplus = rows_ % count_proc; | ||
int offset = 0; | ||
for (int i = 0; i < count_proc; ++i) { | ||
if (surplus > 0) { | ||
proc_[i] = (count_proc_ + 1) * cols_; | ||
--surplus; | ||
} else { | ||
proc_[i] = count_proc_ * cols_; | ||
} | ||
off[i] = offset; | ||
offset += proc_[i]; | ||
} | ||
} | ||
std::vector<int> expected_proc = {3, 3, 3, 3, 3}; | ||
std::vector<int> expected_off = {0, 3, 6, 9, 12}; | ||
EXPECT_EQ(proc_, expected_proc); | ||
EXPECT_EQ(off, expected_off); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What are you testing in those tests? If you want to test the distribution resolving functionality from the Task class, then test it, testing a copy-pasted code does not guarantee that the actual code you use in Task is still working correctly as it may've been changed.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Where are the tests with random matrices?
Do not mergeI cloned your branch, ran perf tests as they do not run as part of actions for pull requests and encountered segfault on 3 processes. So, with func tests it will be the same, that's why you didn't add random tests. |
#include "core/perf/include/perf.hpp" | ||
#include "mpi/sedova_o_vertical_ribbon_scheme/include/ops_mpi.hpp" | ||
|
||
TEST(sedova_o_vertical_ribbon_scheme_mpi, Performance_Pipeline_Run) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Perf tests should be renamed
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
fixed
Боже, как я опять тут фигурирую... Ребят, прошу вас, свои смелые предположения формата "желтой прессы" можно и не оглашать на обильную аудиторию данного PR. Я вас несомненно понимаю, но не надо меня пожалуйста больше впутывать, с меня достаточно |
Вот вам человек сам и расписался, что задолбался участвовать в этом несчастном #386, по итогу имеем реально пустой набор тестов, устаревший аппрув от @KseniyaBeskhmelnova с единственной просьбой "add tests on big sizes of matrix" (где, кстати?) и такого же качества аппрув от @KolodkinGrigorii, если убрать предложенные им тесты, то реально останутся только тесты на краденную функцию для создания массивов в количестве 4 штук и тест на заранее заготовленные данные, который реально ничего не проверяет. Почему нет requires > 4 reviews? |
I am not happy with yet another participation in such a discussion with such a final again, but now I read your message and the code again and noticed one more thing - the only "real" test you wrote about actually tests the sequential version of the task (parallel version is named |
And post these tirades somewhere else next time (I hope this won't be needed though), it's very unpleasant for all of us to participate in your personal conflicts and we don't desire to involuntarily participate in |
…ема умножения матрицы на вектор" (#608) Reverts #386 @Sedova-Olga https://github.com/learning-process/ppc-2024-autumn/actions/runs/12358082298/job/34487772726
Алгоритм ленточной вертикальной схемы:
Алгоритм предполагает вертикальное разбиение матрицы на столбцы (ленты). Каждый процесс отвечает за умножение одной или нескольких лент на вектор. После этого частичные результаты суммируются (функция reduce в параллельной версии).
Существует некоторая структура данных taskData, которая содержит входные данные (матрицу и вектор) и выходные данные (результирующий вектор). Она предоставляет указатели на данные (taskData->inputs[0], taskData->inputs[1], taskData->outputs[0]) и их размеры (taskData->inputs_count[0], taskData->inputs_count[1]).
Эта функция проверяет корректность входных данных. Она проверяет, что taskData не является нулевым указателем, что указатели на входные данные не являются нулевыми и что количество элементов в матрице кратно количеству элементов в векторе (что является необходимым условием для умножения матрицы на вектор).
Этот класс реализует параллельную версию алгоритма с использованием библиотеки Boost.MPI.
-pre_processing(): Функция выполняет предварительную обработку данных. Она извлекает данные из taskData, вычисляет размеры матрицы (количество строк rows_ и столбцов cols_), распределяет работу между процессами (создаются векторы proc и off, которые определяют количество вычислений и смещение для каждого процесса). Распределение основано на вертикальном разбиении матрицы.
-run(): Функция выполняет параллельное вычисление. Она использует функцию для рассылки (broadcast) данных всем процессам (размеры матрицы, распределение работы, входные данные). Каждый процесс вычисляет свою часть произведения, используя proc и off для определения диапазона вычислений. Результаты частичных вычислений сводятся с помощью функции reduce.
-post_processing(): Функция выполняет обработку после вычислений. Если процесс имеет ранг 0 (главный процесс), то он собирает результаты частичных вычислений в результирующий вектор и записывает его в taskData->outputs[0].
Этот класс реализует последовательную версию алгоритма.
-pre_processing(): Извлекает данные из taskData и вычисляет размеры матрицы.
-run(): Выполняет последовательное вычисление произведения матрицы на вектор по ленточной вертикальной схеме, используя стандартные циклы.
-post_processing(): Записывает результирующий вектор в taskData->outputs[0].
Используемые материалы при написании кода