3

假设我有一个多线程应用程序(比如大约 40 个线程)在以 Linux 作为操作系统的多处理器系统(比如 8 个内核)上运行,其中不同的线程更本质上是由内核调度的 LWP(轻量级进程)。

使用 CPU 亲和性有什么好处/缺点?CPU 亲和性是否会通过将线程本地化到核心子集从而最小化缓存共享/未命中来提供帮助?

4

3 回答 3

2

如果您使用严格的关联,则特定线程必须在该处理器(或一组处理器)上运行。如果您有许多完全独立工作的线程,并且它们在比几千字节更大的内存块上工作,那么您不太可能从在一个特定内核上运行中受益 - 因为其他线程很可能在这个特定 CPU 上运行会抛出任何 L1 缓存,很可能也会抛出 L2 缓存。哪个对性能更重要——cahce 内容还是“更快地运行”?某些 CPU 是否始终处于空闲状态,或者每个内核上的 CPU 负载是否为 100%?

但是,只有您知道(直到您告诉我们)您的线程在做什么。每次运行时它们接触的“工作集”(多少内存 - 代码和数据)有多大?每个线程在运行时运行多长时间?与其他线程的交互是什么?其他线程是否使用与“this”线程共享的数据?多少,分享的模式是什么?

最后,最终的答案是“是什么让它跑得更快?” - 只有通过良好的(现实的)基准并尝试不同的可能选项才能找到答案。即使你给我们每一行代码、每个线程的运行时间测量等等,我们也只能做出或多或少复杂的猜测——直到这些已经被尝试和测试(使用不同的使用模式),几乎不可能知道。

一般来说,我建议有很多线程要么表明每个线程不是很忙(CPU 方面),要么你“做错了”......如果它们都运行平缓,更多线程并不好out - 在这种情况下最好有更少的线程,因为它们只会互相争斗。

于 2013-01-05T10:28:10.380 回答
1

调度程序已经尝试将线程保持在相同的内核上,并避免迁移。这表明手动管理线程亲和性可能并不多,除非:

  • 您可以证明由于某种原因内核对您的特定应用程序做得不好;或者
  • 有一些关于您的应用程序的特定知识,您可以利用这些知识取得良好效果。
于 2013-01-05T08:56:10.247 回答
1

将线程本地化到核心子集,从而最大限度地减少缓存共享/未命中

不一定,您也必须考虑缓存一致性,如果两个或多个线程访问共享内存缓冲区并且每个线程都绑定到不同的 CPU 内核,则如果一个线程写入共享缓存行,则它们的缓存必须同步使其他缓存无效的巨大开销。

于 2013-01-05T09:02:46.340 回答