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



我已经为优化算法编写了一些代码,我使用 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

从我机器上的尾部手册页:

-f -f 选项使 tail 在到达文件末尾时不会停止,而是等待其他数据附加到输入。 如果标准输入是管道,则忽略 -f 选项,但不是 如果是先进先出。

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

最新更新