![在 i5 上实现最佳并行处理的最佳线程数](https://linux22.com/image/1336256/%E5%9C%A8%20i5%20%E4%B8%8A%E5%AE%9E%E7%8E%B0%E6%9C%80%E4%BD%B3%E5%B9%B6%E8%A1%8C%E5%A4%84%E7%90%86%E7%9A%84%E6%9C%80%E4%BD%B3%E7%BA%BF%E7%A8%8B%E6%95%B0.png)
我有兴趣在我的台式机/笔记本电脑上运行一些相当重量级的处理(不是太糟糕以至于需要集群,但需要一台好的家用机器)。我的问题是需要创建多少个线程才能最快地完成工作(假设应用程序以很少的开销分配工作负载)。
我通常会为每个处理器创建一个线程,但我想知道 Core i5/i7 上的超线程功能是否意味着我实际上应该为每个处理器创建两个线程(即每个虚拟处理器一个线程)。有人知道吗?
*显然,一个合理的答案是尝试一下看看。由于运行大约需要 12 个小时,我希望第一次就成功,但如果有机会双向运行,我会很乐意发布结果。
答案1
这是一个开放式的问题,需要昂贵的基准测试。我亲眼见过两种情况。除非你真的搞砸了你的多线程,否则差异大约为 +-10%,所以值得两种方式都尝试一下。即使需要很长时间。
许多由英特尔组件构建的高性能计算集群都禁用了 HT。这是有充分理由的,因为这些代码往往会使硬件饱和,因此它们的性能与内存访问的饱和度密切相关 - 在 HT 情况下,由于线程正在计算和打开和关闭,这种情况会更糟。参见http://semiaccurate.com/2012/04/25/does-disabling-hyper-threading-increase-performance/。
但如果你的代码没有经过高度调整,你可能不会体验到几乎相同的性能提升http://semiaccurate.com/2012/04/25/does-disabling-hyper-threading-increase-performance/。
看来,对于单 CPU 计算,禁用超线程可以使某些软件的性能提高 1%,但也会显著损害其他软件的性能。可能损害约 10%。
这意味着,除非您的基准测试另有说明,否则您应该在台式机上为每个超线程/真实核心创建 1 个线程。
答案2
我完全是根据 F@H 折叠的经验来说的,每个核心(无论是虚拟的还是物理的)单线程是最好的。
话虽如此,让单个核心自由地处理后台进程和一般的计算机任务可能是个好主意,因为即使很少的使用也会导致任务陷入瘫痪。
如果您想跟踪正在运行的程序,请查看 CPU 亲和性。一般来说,分配给物理核心优先(IE:甚至编号),然后是超线程核心。