【问题标题】:Avoid repeated if statements in C++ MPI for cout避免在 C++ MPI 中为 cout 重复 if 语句
【发布时间】:2014-08-28 09:15:39
【问题描述】:

我正在用 MPI 编写一个 c++ 程序(C 接口,没有 boost 等)。在我的程序中,我有很多输出,要么是 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 等级的输出...

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

【问题讨论】:

    标签: c++ mpi cout ostream


    【解决方案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

    【讨论】:

      【解决方案2】:

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

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

      然后你只需写

      COUT << string;
      

      不过,在我看来,尚不清楚这种方法是否比您的更好。

      【讨论】:

        猜你喜欢
        • 2017-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-11
        • 1970-01-01
        • 2016-02-19
        • 1970-01-01
        • 2023-04-03
        相关资源
        最近更新 更多