Отправка столбцов матрицы с использованием MPI_Scatter

Я пытаюсь написать программу умножения матрицы на вектор, используя 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);

Это работает отлично, но Не могу сказать, что я действительно понимаю, как это работает.

  1. Как MPI_Type_vectorхранится в памяти?
  2. Как работает MPI_Type_create_resized()и что именно он делает?

Пожалуйста, имейте в виду, что я совсем новичок в MPI. Заранее спасибо.

11
задан Community 23 May 2017 в 11:54
поделиться