我已经编写了一些优化算法的代码,我已经使用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应用程序,以便我可以在单独的窗口中打开它们吗?
答案 0 :(得分:1)
您正在寻找tail -f
:
$ tail -f foo
从我机器上的尾部联机帮助页:
-f -f选项导致tail在到达文件结尾时不停止,而是等待将其他数据附加到输入。如果标准输入是管道,则忽略-f选项,但不是 如果它是一个FIFO。