避免在c ++的C ++ MPI中重复if语句

时间:2014-08-28 09:15:40

标签: c++ mpi cout ostream

我正在用MPI编写一个c ++程序(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的等级的输出...

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

2 个答案:

答案 0 :(得分:1)

如果您愿意牺牲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();
   ...
}

改编自this answer

答案 1 :(得分:0)

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

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

然后你只需写

COUT << string;

在我看来,目前尚不清楚这种方法是否优于你的方法。