【问题标题】:MPI. Running mpi in functionMPI。在函数中运行 mpi
【发布时间】:2017-01-18 18:21:17
【问题描述】:

我想使用来自main 的 mpi 运行一些功能,但我不知道应该如何。它看起来像:

#define MAXSIZE 100
int main (int argc, char **argv) {
  int i;
  float matrixA[MAXSIZE][MAXSIZE], matrixB[MAXSIZE][MAXSIZE], matrixC[MAXSIZE][MAXSIZE];
  for(i=0;i<10;i++){
    multiply(matrixA, matrixB, matrixC);
  }
}
void multiply(float matrixA[MAXSIZE][MAXSIZE], float matrixB[MAXSIZE][MAXSIZE], float matrixC[MAXSIZE][MAXSIZE]) {
  int rank; //process rank
  int size; //number of processes
  MPI_Init(&argc, &argv); //initialize MPI operations
  MPI_Comm_rank(MPI_COMM_WORLD, &rank); //get the rank
  MPI_Comm_size(MPI_COMM_WORLD, &size); //get number of processes

  ...someoperation...
  MPI_Finalize();
}

我知道如何在不使用其他功能的情况下运行基本的 MPI,但我需要这种结构。

【问题讨论】:

  • MPI 是分布式内存系统,因此数据通常不会对所有处理器都可用,因此您决定您的逻辑应该是什么。通常,针对不同系统(OpenMP、mpi 和 cuda)编写不同的并行编程算法。因此,使用朴素算法加快速度几乎是不可能的,尤其是在 mpi 和 cuda 情况下。
  • 为此,您必须将矩阵分散到其他处理器,并决定策略(最终数组的哪一部分将由哪个处理器计算),然后在一个处理器上收集这些计算数据。

标签: function mpi


【解决方案1】:

在应用程序实例中,MPI最多可以初始化一次。所以你提供的代码结构是行不通的。

您的程序的正确结构如下:

#define MAXSIZE 100
int main (int argc, char **argv) {
  int i;
  float matrixA[MAXSIZE][MAXSIZE], matrixB[MAXSIZE][MAXSIZE], matrixC[MAXSIZE][MAXSIZE];
  int rank; //process rank
  int size; //number of processes
  MPI_Init(&argc, &argv); //initialize MPI operations
  MPI_Comm_rank(MPI_COMM_WORLD, &rank); //get the rank
  MPI_Comm_size(MPI_COMM_WORLD, &size); //get number of processes
  for(i=0;i<10;i++){
    multiply(matrixA, matrixB, matrixC);
  }
  MPI_Finalize();
}
void multiply(float matrixA[MAXSIZE][MAXSIZE], float matrixB[MAXSIZE][MAXSIZE], float matrixC[MAXSIZE][MAXSIZE]) {    
  ...someoperation...
}

【讨论】:

    【解决方案2】:

    这可能对你有帮助。在你的程序中,有一个 for 循环 for(i=0;i<10;i++) { multiply(matrixA, matrixB, matrixC); } 我感觉你正在尝试执行 10 次乘法。你可以将每个乘法分配给一个进程。所以你可以使用命令 mpirun -np 10 可执行文件。

    【讨论】:

      猜你喜欢
      • 2013-12-08
      • 1970-01-01
      • 2011-11-12
      • 2010-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-04
      • 1970-01-01
      相关资源
      最近更新 更多