在MPI中对cout进行"原子"调用

Mad*_*ent 5 c++ cout atomic blocking openmpi

我感兴趣的是OpenMPI中是否有命令或技术要进行原子调用以写入stdout(或者就此而言,任何流).

我注意到的是,在执行MPI程序期间,写入cout(或其他流)的调用可能会变得混乱,因为每当proc到达某段代码时,每个proc都可以写入.报告结果时,可以通过多个过程写入一行,这会使问题混乱.所以2个不同的过程可能会做这样的事情:

//Proc 10 - results calculated somewhere above
//  result1 = 10
//  result2 = 11
cout << "My results are: " << result1 << " " << resul2 << endl;
Run Code Online (Sandbox Code Playgroud)

和:

//Proc 20 - results calculated somewhere above
//  result1 = 20
//  result2 = 21
cout << "My results are: " << result1 << " " << resul2 << endl;
Run Code Online (Sandbox Code Playgroud)

但结果可能是:

My results are: 20 My results are: 10 11 21
Run Code Online (Sandbox Code Playgroud)

我正在寻找的东西就像"阻塞"或原子cout(以及可能写入其他流,如文件流).因此,一旦我开始编写一个cout,它就会阻塞直到语句结束,或者直到endl或者刷新流发出.如果是这种情况,我会保证两条线是分开的(当然,我仍然不知道哪条线会先出现):

My results are: 20 21
My results are: 10 11
Run Code Online (Sandbox Code Playgroud)

osg*_*sgx 3

使用标准 I/O 流(C 语言中的 stdout 和 stdin 或 C++ 中的 cout 和 cin)并不是 MPI 的最佳部分(OpenMPI 实现了 MPI)。有一些关于此的幻灯片:http://www.csee.wvu.edu/~donm/classes/cs591x/notes/io1.ppt和幻灯片 10 有一个解决方案。(或《PS Pacheco 用 Mpi 进行并行编程》一书的第 8.1 章)

在排名 0 的进程中使用 cout 执行所有 I/O。如果您想从其他进程输出一些数据,只需将包含此数据的 MPI 消息发送到排名 0 即可。