C++ c++;所有进程启动前的MPI指令
假设我有这样的代码:C++ c++;所有进程启动前的MPI指令,c++,mpi,C++,Mpi,假设我有这样的代码: int main(..){ cout<<"something"<<endl; MPI_INIT(...); .. .. .. MPI_FINALIZE(); } int main(…){ cout实现这一点没有可移植的方法 另外,请注意,大多数MPI实现通过mpirun同时启动所有MPI任务
int main(..){
cout<<"something"<<endl;
MPI_INIT(...);
..
..
..
MPI_FINALIZE();
}
int main(…){
cout实现这一点没有可移植的方法
另外,请注意,大多数MPI实现通过mpirun
同时启动所有MPI任务。长话短说,MPI_Init()
使独立进程从唯一作业变成MPI任务
使用最近打开的MPI,您可以尝试测试PMIX\u RANK
环境变量,
我只能猜测,MPICH导数也有类似的方法
但再一次,这些都是不可移植的技巧,你不应该这样做。你把MPI误认为OpenMP。OpenMP使用fork-join模型,程序最初以串行代码的形式运行,并生成线程来并行执行某些区域。MPI是一种多进程范例,通常所有进程都是从在MPI\u Init()之前执行完全相同的代码
一个相对可移植的解决方案是将许多MPI实现执行MPMD(多程序多数据)启动的能力与命令行参数相结合,从而执行特定的预初始化代码:
int main (int argc, char **argv) {
if (argc > 1 && argv[1] == "-preinit") {
...
cout << "Something" << endl;
}
MPI_Init(NULL, NULL);
..
..
MPI_Finalize();
}
这将启动100个MPI进程,其中只有一个进程接收到-preinit
命令行参数
尽管如此,真正可移植的方法是首先初始化MPI,然后获得等级,然后在等级0中执行任何必须执行的操作。在调用mpirun
之前将其放入脚本中。也许吧?但我在控制台中执行mpirun。所以我必须编写其他程序?!对不起,我是MPI新手,我的意思是你可以编写一个三行bash
脚本(Linux/macOS)或批处理脚本(Windows),执行一些设置,然后调用mpirun
。啊,好的,但我不能这样做,因为它不是一个cout,而是一个返回值的函数。我编写cout是为了简化(如果我测试秩,并且只使用一个进程执行一条指令,那么我可以将该指令返回的值设置为全局值吗?。如果我理解正确,则可以MPI_Bcast()
该值。非常感谢。但是在Mpi_init之后,if中的变量不可见,对吗?@dang92,Mpi中的所有变量都是进程的本地变量,并且存在于语言语法定义的范围内。在这方面,Mpi_init
只是一个常规函数调用,与例如printf()相同
。如果需要从一个进程向其他进程广播值,请使用MPI\u Bcast
。
mpiexec -n 1 ./program -preinit : -n 99 ./program