Я пытаюсь написать программу умножения матрицы на вектор, используя MPI. Я пытаюсь отправить столбцы матрицы в отдельные процессы и локально вычислить результат. В конце я делаю MPI_Reduce
, используя операцию MPI_SUM
.
Отправлять строки матрицы легко, так как C хранит массивы в порядке строк, а столбцы — нет (если вы не отправляете их один за другим). Я прочитал вопрос здесь:
MPI_Scatter — отправка столбцов двумерного массива
Джонатан Дурси предложил использовать новые типы данных 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. Заранее спасибо.