1

第一个问题:

我想知道如何将函数调用并行化到同一个函数,但在 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);
  }
}

如果我只是为(当然是 omp 标头)应用一个 pragma 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);
  }

状态:未解决

4

2 回答 2

0

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

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

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

此外,您发布的代码确实有些混乱,具体来说,它是一个 C 程序,其行为类似于 bash 脚本。

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

在许多集群上,调用system只会在主机节点上执行,不会导致加速和 io 问题。您显示的命令完全行不通。

于 2013-01-27T13:58:13.390 回答
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()),例如,如果它们通过 InfiniBand 等基于 RDMA 的网络进行通信。相反,您可以合并这两个程序以创建一个混合 MPI/OpenMP 程序。

于 2013-01-27T14:29:24.557 回答