如何使用MPI或OpenMP并行化函数调用

时间:2013-01-27 13:29:41

标签: c mpi openmp

第一个问题:

我想知道如何将函数调用并行化到同一个函数,但在for循环中使用不同的输入参数。例如(C代码):

//a[i] and b[i] are defined as elements of a list with 2 columns and N rows
//i is the row number

#pragma omp parallel
{
char cmd[1000];
  #pragma omp for nowait
  for(i=0; i<N; i++) {
    //call the serial programm
    sprintf(cmd, "./serial_program %f %f", a[i], b[i]);
    system(cmd);
  }
}

如果我只是应用pragma omp(当然+ + omp标题)没有任何反应。也许这对于OpenMP来说是不可能的,但是它可以用MPI实现,那么它会是什么样子呢?到目前为止,我只对OpenMP有经验,但对MPI没有经验。 更新:在并行区域内定义cmd

状态:已解决

第二个问题:

如果我有一个OpenMP并行化程序,并且我想在群集中的不同节点之间使用它,我如何使用MPI在不同节点之间分配调用以及如何编译它?

//a[i] and b[i] are defined as elements of a list with 2 columns and N rows
//i is the row number

  for(i=0; i<N; i++) {
    //call the parallelized program
    sprintf(cmd, "./openmp_parallelized_program %f %f", a[i], b[i]);
    system(cmd);
  }

状态:未解决

2 个答案:

答案 0 :(得分:0)

MPI是一种在计算集群的节点之间进行通信的方法。它使一个主板可以与另一个主板通信。 MPI适用于集群和大型计算任务,不适用于并行化桌面应用程序。

MPI中的通信是通过显式发送和接收数据完成的。

与OpenMP不同,没有#pragma会自动促进并行化。

此外,您发布的代码确实存在一些问题,具体而言,它是一个C程序,就像bash脚本一样。

#!/bin/bash
N=10
for i in `seq 1 $N`;
do
./program $i &
done

在许多集群上,对system的调用只会在主机节点上执行,导致没有加速和io问题。你展示的命令完全不可行。

答案 1 :(得分:0)

使用MPI,您可以执行以下操作:

int rank, size;

MPI_Init();
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);

int start = (rank*N)/size;
int end = ((rank+1)*N)/size;

for (i = start; i < end; i++)
{
   sprintf(cmd, "./openmp_parallelized_program %f %f", a[i], b[i]);
   system(cmd);
}

MPI_Finalize();

然后每个节点使用一个进程运行MPI作业。但有一点需要注意。某些MPI实施不允许进程在某些条件下调用fork()(以及system()调用fork()),例如如果他们通过基于RDMA的网络进行通信,如InfiniBand。相反,您可以合并两个程序以创建一个混合MPI / OpenMP程序。