gpt4 book ai didi

c++ - linux 中的任务集到底做了什么?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:57:33 27 4
gpt4 key购买 nike

我有一个程序在使用 Intel TBB 的 32 核系统上运行。我遇到的问题是,当我将程序设置为使用 32 个线程时,与 16 个线程相比,性能没有获得足够的提升(仅提升 50%)。但是,当我使用时:

taskset 0xFFFFFFFF ./foo

这会将进程锁定到 32 个内核,性能会好很多。

我有以下两个问题:

  1. 为什么?默认情况下,操作系统无论如何都会将所有 32 个内核用于 32 线程程序。
  2. 我假设即使使用 taskset,操作系统也被允许(将)交换虚拟线程和物理线程,即线程未固定。我说得对吗?

谢谢。

最佳答案

操作系统可能会选择使用较少的内核来进行缓存。想象一下,如果应用程序使用同一组内存,那么每次写入都会导致缓存失效。强制锁定本质上是告诉操作系统并发的缓存开销不值得,继续使用所有内核。

您还必须记住,还有其他进程要运行(例如来自内核的 kthreads 和后台进程。)并且在内核之间迁移线程的成本很高,如果您的线程没有执行均匀的工作量,可能会导致不平衡。

另请记住,操作系统会尝试在所有进程(而不仅仅是您的进程)的核心上平均分配工作。这意味着负载均衡器可能会选择不将您的进程放在所有 32 个核心上,因为当前有其他进程正在运行并且迁移成本可能很高,或者均匀分布您的进程可能会导致 cpu 核心之间的负载不平衡。操作系统力求最佳系统性能,不一定是每个应用程序性能最佳。

关于c++ - linux 中的任务集到底做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14512197/

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