【问题标题】:htop displays multiple cores in use for one process without use of multithreadinghtop 显示一个进程使用的多个内核,而不使用多线程
【发布时间】: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


【解决方案1】:

感谢 cmets 了解我的程序使用多核的可能原因。我发现原因如下:

我在我的程序中使用了 Armadillo(用于 c++ 的线性代数库),它在不使用 MPI 的情况下并行化它的一些函数,但使用 LAPACK 和 BLAS(如this question 中所述)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-16
    • 2015-07-25
    • 1970-01-01
    • 2020-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多