第一个问题:
我想知道如何将函数调用并行化到同一个函数,但在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);
}
状态:未解决
答案 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程序。