假设我有一个多线程应用程序(比如大约40个线程)在多处理器系统(比如8个核心)上运行,其中Linux作为操作系统,其中不同的线程更基本上是由内核调度的LWP(轻量级进程)
使用CPU关联性有什么好处/缺点?通过将线程本地化到核心子集,CPU亲缘性是否有用,从而最大限度地减少缓存共享/未命中?
答案 0 :(得分:3)
如果使用严格的亲和关系,则必须在该处理器(或一组处理器)上运行特定的线程。如果你有许多完全独立工作的线程,并且它们在大块内存上工作而不是几千字节,那么在一个特定的内核上运行你不太可能会受益很多 - 因为在这个特定的CPU上运行其他线程很可能会抛出任何L1缓存,很可能也会抛出L2缓存。哪个对于性能更重要 - 更重要的内容还是“更快地运行”?某些CPU是否始终处于空闲状态,或者每个核心的CPU负载是100%?
然而,只有你知道(直到你告诉我们)你的线程在做什么。 “工作集”(他们每次运行时会触及多少内存 - 代码和数据)有多大?每个线程在运行时运行多长时间?与其他线程的交互是什么?其他线程是否使用带有“this”线程的共享数据?分享的模式是多少和什么?
最后,最终的答案是“是什么让它跑得更快?” - 只有拥有好的(现实的)基准并尝试不同的可能选项才能找到答案。即使你给我们每一行代码,每个线程的运行时间测量等等,我们也只能进行或多或少的复杂猜测 - 直到这些都经过了尝试和测试(使用VARYING使用模式),几乎不可能知道。
一般来说,我建议让很多线程建议每个线程都不是很忙(CPU方面),或者你“做错了”...如果它们是更多线程并不是更好所有人都跑得很平坦 - 在这种情况下更好地拥有更少的线程,因为他们只会互相争斗。
答案 1 :(得分:1)
调度程序已尝试将线程保留在相同的核心上,并避免迁移。这表明手动管理线程关联可能没有很多里程,除非:
答案 2 :(得分:0)
将线程本地化为核心子集,从而最大限度地减少缓存 共享/未命中
不一定,你必须考虑缓存一致性,如果两个或多个线程访问共享内存缓冲区并且每个线程绑定到不同的CPU核心,如果一个线程写入共享缓存线,则必须同步它们的缓存将使其他缓存失效的重大开销。