我正在用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的等级的输出...
这个问题对我来说似乎很常见,所以如果已经在其他地方回答过,我很抱歉。我没有通过搜索找到答案,并且对任何重定向现有问题感到高兴。
答案 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;
在我看来,目前尚不清楚这种方法是否优于你的方法。