避免在针对cout的C++MPI中重复if语句

Avoid repeated if statements in C++ MPI for cout

本文关键字:if 语句 C++MPI cout      更新时间:2023-10-16

我正在用MPI(c接口,没有boost等)编写一个c++程序。在我的程序中,我有很多输出,要么到cout,要么到文件,这些输出只在秩0上完成。有什么好方法可以避免吗写if (rank == 0) cout << string

有两种方法可以在我的计算机上使用MPI实现,但对我来说都不稳定:

if (rank != 0)
  cout.setstate(ios_base::badbit);

这有效地禁用了除0以外的所有列的输出,但允许吗?如果我这样做会有问题吗?

另一个想法是创建一个未打开的ofstream,并将输出重定向到那里。

ostream* os;
ofstream nullstream;
if (rank == 0)
  os = &cout;
else
  os = &nullstream;
*os << "rank " << rank << endl;

这使nullstream处于错误状态,但也有效地禁用了所有非0…列组上的输出

这个问题对我来说似乎很常见,所以如果在其他地方已经得到了回答,我很抱歉。我没有通过搜索找到答案,很高兴能重定向到现有问题。

如果您愿意牺牲对Windows系统的可移植性,在POSIX系统上静音输出的正确方法是将标准输出(以及可选的标准错误)重定向到/dev/null:

int main() {
   ...
   std::ofstream sink("/dev/null");
   if (rank != 0) {
     // Mute standard output
     std::cout.rdbuf(sink.rdbuf());
     // Optionally mute standard error
     std::cerr.rdbuf(sink.rdbuf());      
   }
   no_output_from_other_ranks_from_now_on();
   ...
}

根据这个答案改编。

我通常以某种方式使用预处理器宏,例如

#define COUT if(rank == 0) std::cout

然后你只需写

COUT << string;

不过,在我看来,目前还不清楚这种方法是否比你的方法更好。