gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:05:23 24 4
gpt4 key购买 nike

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

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

#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

来 self 机器上的 tail 联机帮助页:

-f The -f option causes tail to not stop when end of file is reached, but rather to wait for additional data to be appended to the input. The -f option is ignored if the standard input is a pipe, but not if it is a 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

关于c++ - 如何实时监控不同的 OpenMP 线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48394557/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com