如何实时监控不同的OpenMP线程?

时间:2018-01-23 05:03:45

标签: c++ multithreading parallel-processing openmp

我已经编写了一些优化算法的代码,我已经使用OpenMP进行并行化以加快速度,但现在几乎不可能看到不同的线程发生了什么,因为它们都打印到{{1} }。我想知道是否有一种方法可以将输出发送到不同的终端窗口(我正在使用Linux Mint OS),以便我能够分别监视不同的线程?

我正在运行的代码的一个非常基本的版本是:

std::cout

这里,#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指针

这可以为我的所有线程提供单独的文件,但除非我想等到所有计算完成并查看输出文件然后,我必须关闭文件并再次打开它们以刷新内容。有没有办法可以实时分别监控这些线程?任何人都可以建议一个自动刷新文本文件的Linux应用程序,以便我可以在单独的窗口中打开它们吗?

1 个答案:

答案 0 :(得分:1)

您正在寻找tail -f

$ tail -f foo

从我机器上的尾部联机帮助页:

  

-f -f选项导致tail在到达文件结尾时不停止,而是等待将其他数据附加到输入。如果标准输入是管道,则忽略-f选项,但不是                如果它是一个FIFO。

另请参阅:https://unix.stackexchange.com/questions/303623/how-can-i-view-the-file-output-of-a-program-in-a-text-file-as-its-being-populat