【发布时间】:2018-02-14 13:57:51
【问题描述】:
我编写了一个 C++ 程序,它不使用多线程,但使用 -O2、-O3 或 -Ofast 标志编译以优化速度。
该程序名为mir.out,并从bash 脚本my_script 运行。运行时间取决于:
time bash my_script
输出是
real 18m26.001s
user 56m4.507s
sys 91m14.536s
由此我得出结论,多个内核并行运行(我有 8 个内核),因为用户和系统时间远大于实时时间。这是正确的吗?
我用 htop 测试了一下,发现如下
表示程序使用了所有内核。程序结束后
只显示了核心的少量使用。
我没有使用 STL 中可以并行化的任何函数(请参阅Parallelization in STL),也没有发现隐藏在 -O2、-O3 或 -Ofast 中的任何标志,这些标志可以自动并行化(请参阅compiler flgas for optimization)。
所以我的问题是,为什么我的程序使用多个内核?
编辑:感谢 cmets 我找到了答案:
我将犰狳库用于线性代数。我认为它需要 OpenMPI 来处理多线程,但一些研究表明,使用 BLAS 和 LAPACK 这已经成为可能。
【问题讨论】:
-
可能在等待 IO 请求。
-
是什么让您认为您的程序在多个内核上并行运行?
-
@Ron:总用户/系统明显高于“真实”(又名“挂钟时间”),这是一个很好的迹象,表明该进程正在运行多个线程。单线程应用程序将有 real >= user + sys(给出或接受一些测量误差)
-
当然,因为
my_script没有显示给我们,所以不可能说脚本内部发生了什么,以及它的哪一部分需要什么时间。 -
在不了解您的代码是什么样子的情况下,不可能回答为什么您的应用程序使用多个线程(而且似乎也不是!)。也许您正在调用一个将工作拆分为多个核心的库。通常,编译器不会这样做,但是有很多库可以自动检测多个内核并将工作分散到这些内核上。编译器选项在这里可能没有任何区别。
标签: c++ multithreading compiler-optimization