相关疑难解决方法(0)

使用MPI_Scatter发送矩阵的列

我正在尝试使用MPI编写矩阵向量乘法程序.我正在尝试将矩阵的列发送到单独的进程并在本地计算结果.最后我做了一个MPI_Reduce使用MPI_SUM操作.

发送矩阵的行很容易,因为C按行主顺序存储数组,但列不是(如果不逐个发送).我在这里读到了这个问题:

MPI_Scatter - 发送2D数组的列

Jonathan Dursi建议使用新的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);
Run Code Online (Sandbox Code Playgroud)

这很完美,但我不能说我真的明白它是如何工作的.

  1. 如何MPI_Type_vector存储在内存中?
  2. MPI_Type_create_resized()工作如何以及它究竟做了什么?

请记住,我是MPI的初学者.提前致谢.

c mpi

11
推荐指数
1
解决办法
8639
查看次数

如何从处理器MPI_Gatherv列,其中每个进程可以发送不同数量的列

假设2个进程正在参与.过程0(等级0)具有

A = { a d
      b e
      c f
    }
Run Code Online (Sandbox Code Playgroud)

和进程1(排名1)有

A = { g
      h
      i
    }
Run Code Online (Sandbox Code Playgroud)

我希望两个处理器都将这些列发送到0级,以便排名0在另一个2D阵列中具有以下内容.

B = { a d g
      b e h
      c f i
    }
Run Code Online (Sandbox Code Playgroud)

我为MPI_Gatherv创建了一个新的列数据类型,我正在尝试以下代码,这让我无处可去.

我的具体问题是:

  1. 我应该如何处理这个问题
  2. 什么应该是send_type和recv_type.
  3. 如何指定位移(如果它们是新数据类型或MPI_CHAR)

谢谢.

这是我的代码:

#include <stdio.h>
#include <mpi.h>

int main(int argc, char *argv[])
{
  int numprocs, my_rank;
   long int i, j;
   MPI_Status status;
   char **A;
   char **B;
  MPI_Init(&argc, &argv);
  MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
  MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);

  if(my_rank == 0)
  {
    A = (char **)calloc((3), sizeof(char *));
    B …
Run Code Online (Sandbox Code Playgroud)

c mpi

6
推荐指数
1
解决办法
3289
查看次数

标签 统计

c ×2

mpi ×2