我已经编写了一个MPI程序,可以在C ++中并行化。我想使它成为可选的并行或串行编译方式。采取以下hello world程序,实现该目的的常用方法是什么?我看到一些使用选项--serial /-parallel编译的软件,但不确定如何完成。
MPI版本:
#include <mpi.h>
#include <stdio.h>
int main(int argc, char** argv) {
MPI_Init(&argc, &argv);
int numprocs;
int procid;
MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
MPI_Comm_rank(MPI_COMM_WORLD, &procid);
printf("Hello world from process %d \n", procid);
MPI_Finalize();
}
序列号:
#include <stdio.h>
int main(int argc, char** argv) {
num = stoi(argv[1]);
for (int i = 0; i < num; i++){
printf("Hello world from process %d \n", num);
}
}
答案 0 :(得分:1)
您的问题有两个层次:
下面的代码将两者结合在一起。
如果第一个命令行参数为“ -parallel”,则程序将以MPI初始化例程开始,并以MPI终结例程终止。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main (int argc, char *argv[])
{
int iproc = 0;
int nproc = 1;
int par = (strcmp(argv[1], "-parallel") == 0);
int nwork = atoi(argv[2]);
if (par) parallel_init(&argc, &argv, &iproc, &nproc);
for (int i = 0; i < nwork; i++)
{
if (i % nproc == iproc)
{
printf("Running task %d by rank %d\n", i, iproc);
/* ... etc ... */
}
}
if (par) parallel_final();
return 0;
}
此外,您可以通过将-DNOMPI
标志传递给编译器来完全不需要MPI来编译此源。
#ifndef NOMPI
#include <mpi.h>
#endif
void parallel_init (int *pargc, char **pargv[], int *piproc, int *pnproc)
{
#ifdef NOMPI
*piproc = 0;
*pnproc = 1;
#else
MPI_Init(pargc, pargv);
MPI_Comm_size(MPI_COMM_WORLD, pnproc);
MPI_Comm_rank(MPI_COMM_WORLD, piproc);
#endif
}
void parallel_final ()
{
#ifndef NOMPI
MPI_Finalize();
#endif
}
例如,
> mpicc main.c
> ./a.out -serial 4
Running task 0 by rank 0
Running task 1 by rank 0
Running task 2 by rank 0
Running task 3 by rank 0
> mpiexec -n 2 ./a.out -parallel 4
Running task 0 by rank 0
Running task 2 by rank 0
Running task 1 by rank 1
Running task 3 by rank 1