1

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

taskset 0xFFFFFFFF ./foo

这会将进程锁定到 32 个核心,性能要好得多。

我有以下两个问题:

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

谢谢。

4

1 回答 1

3

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

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

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

于 2013-01-24T22:45:16.173 回答