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