Я пытаюсь написать программу умножения матрицы-вектора с использованием MPI. Я пытаюсь отправить столбцы матрицы для разделения процессов и локально вычислить результат. В конце я выполняю операцию MPI_Reduce
с помощью операции MPI_SUM
.
Отправка строк матрицы легко, так как C хранит массивы в строчном порядке, но столбцы не являются (если вы не отправляете их один за другим). Я прочитал здесь вопрос:
MPI_Scatter - отправка столбцов 2D-массива
Джонатан Дурси предложил использовать новые типы данных MPI, и вот что я сделал, адаптировав его код к моим собственным потребностям:
double matrix[10][10];
double mytype[10][10];
int part_size; // stores how many cols a process needs to work on
MPI_Datatype col, coltype;
// ...
MPI_Type_vector(N, 1, N, MPI_DOUBLE, &col);
MPI_Type_commit(&col);
MPI_Type_create_resized(col, 0, 1*sizeof(double), &coltype);
MPI_Type_commit(&coltype);
// ...
MPI_Scatter(matrix, part_size, coltype,
mypart, part_size, coltype,
0, MPI_COMM_WORLD);
// calculations...
MPI_Reduce(local_result, global_result,
N, MPI_DOUBLE,
MPI_SUM,
0, MPI_COMM_WORLD);
Это работает отлично, но я не могу сказать, что я действительно понимаю, как это работает.
- Как хранится
MPI_Type_vector
в памяти? - Как работает
MPI_Type_create_resized()
и что он делает?
Пожалуйста, имейте в виду, что я новичок в MPI. Спасибо заранее.