我想使用MPI来并行化我的代码中多次调用的函数。我想知道的是,如果我在函数内部使用MPI_Init
,每次调用函数时它是否会产生进程,或者只产生一次产生?是否有一些已知的设计模式以系统的方式做到这一点?
答案 0 :(得分:2)
这不是MPI(或分布式内存编程)的工作方式;你不能像OpenMP那样以一种方式并行化函数。在MPI中,进程不是在MPI_Init()
时生成的,而是在运行可执行文件时(例如,使用mpiexec;即使使用MPI_Comm_spawn()
也是如此。部分原因是在分布式内存计算中,在潜在的大量无共享节点上启动进程是一项非常昂贵的任务。
你可以通过让你正在调用的函数在一个单独的可执行文件中来拼凑一些东西,但我不确定这是你想要的。
答案 1 :(得分:2)
MPI_Init()
调用只是初始化MPI环境,它本身不进行任何并行化。并行性来自于你编写程序的方式。
并行“Hello,World”,printf()
根据运行的等级(处理器)执行不同的操作。进程数由执行程序的方式决定(例如,进程数通过-n参数设置为mpiexec或mpirun)
int main(int argc, char *argv[]) {
char name[BUFSIZ];
int length=BUFSIZ;
int rank;
int numprocesses;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &numprocesses);
MPI_Comm_rank( MPI_COMM_WORLD, &rank );
MPI_Get_processor_name(name, &length);
printf("%s, Rank %d of %d: hello world\n", name, rank, numprocesses);
MPI_Finalize();
return 0;
}