我已经为优化算法编写了一些代码,我使用OpenMP对其进行了并行化以加快速度,但是现在几乎不可能看到不同线程的情况,因为它们都打印到std::cout
。我想知道是否有一种方法可以将输出发送到不同的终端窗口(我正在使用Linux Mint OS),以便能够分别监视不同的线程?
我正在运行的代码的一个非常基本的版本是:
#pragma omp parallel for
for (int i=0; i < N_ITER; ++i){
solve(seed_solution);
}
在这里,
seed_solution
是该问题的初始可行解决方案,而solve()
是随机优化算法,该算法会针对用作输入的种子解决方案生成相邻解决方案。solve()
有几个输出到std::cout
的进程,但是由于线程都同时运行,因此无法跟踪何时发生了什么。我可以做到:std::cout << "thread(" << omp_get_thread_num() << "): " <<
对于每一行,但最后我得到的输出如下:
thread(0): text text text
thread(2): text text text text text
thread(1): text text text text
thread(1): text text text text text text
thread(3): text text text
thread(0): text text text text text text text
这很难解析,尤其是当您实时查看它,试图查找任何要更改的错误或参数时。
我对问题的解决方案是将每个线程输出到这样的单独文件中:
std::vector<std::ofstream*> out_streams;
for (int i = 0; i < omp_get_max_threads(); ++i){
std::ofstream* out_stream = new std::ofstream("thread_" + std::to_string(i) + ".out");
out_streams.push_back(out_stream);
}
#pragma omp parallel for
for (int i=0; i < N_ITER; ++i){
solve(seed_solution, out_streams[omp_get_thread_num()]);
}
然后在
solve()
(已修改为将std::ofstream
指针作为其参数之一)内,而不是打印到std::cout
,而是打印到out_stream
指针。这可以为我的所有线程提供单独的文件,但是除非我要等到所有计算完成后再查看输出文件,否则我必须关闭文件,然后再次打开它们以刷新内容。有什么办法可以实时监视这些线程?谁能建议一个可以自动刷新文本文件的Linux应用程序,以便我可以在单独的窗口中打开它们?
最佳答案
您正在寻找tail -f
:$ tail -f foo
从机器上的尾页联机帮助页:
另请参阅:https://unix.stackexchange.com/questions/303623/how-can-i-view-the-file-output-of-a-program-in-a-text-file-as-its-being-populat