6核12线程CPU计算的最佳并行进程数

问题描述 投票:0回答:1

在一台配备“6 核/12 线程”的 Intel CPU 的计算机上,我想运行尽可能多的进程,每个进程都使用不同的输入数据进行类似的数学计算(每个进程有一个线程)。不涉及GPU,也不需要进程间通信。

同一可执行文件进行数学计算的最佳并行进程数是多少?

我应该运行 6 个进程(每个物理核心一个进程)吗?或者 12 个进程(每个线程/虚拟核心一个)?

如果一个进程每秒进行 1000 次计算,我很确定运行其中 6 个进程的速度将分别约为 1000/秒(因此总共约为 6000/秒)。

但是运行 12 个进程不会导致每个进程每秒仅进行 500 次计算吗?

TL;DR: 我应该在“6 核/12 线程 Intel CPU”上为每个“核心”运行一个进程还是每个“线程”运行一个进程?

performance parallel-processing multiprocessing cpu cpu-cores
1个回答
3
投票

这非常依赖于实际的计算代码。有些应用程序可以从超线程中受益,而有些则不能。高性能应用程序很少受益于超线程,因此假设代码受计算限制且可扩展性良好,那么每个核心使用 1 个进程无疑是最佳配置。

最新 Intel 处理器(例如 Skylake/Icelake)的多个超线程可以共享一些执行端口。因此,如果一个进程无法使端口饱和,则整体执行速度会更快。实际上,这有点复杂(现代处理器“非常”复杂),因为受计算限制的进程可以受到处理器的其他部分(例如指令解码或更棘手的低级单元)的限制。 例如,以下 C 代码应该受益于超线程(假设没有应用快速数学优化,并且代码是经过优化的编译器):

float sum = 0.f; for(int i=0 ; i<maxi ; ++i) sum += array[i];

事实上,浮点加法指令的延迟为 3 到 4 个周期,而一般每个周期可以执行 2 个周期(Skylake 之前只有 1 个)。这意味着代码受到加法指令链的延迟的限制。在此期间,超线程可以使用等待执行端口,从而使执行速度提高两倍(其他瓶颈导致实际执行速度不会那么快)。如果使用快速数学优化来优化代码,则编译器可以展开循环并利用
指令级并行

(IPC)。 低 IPC 通常意味着使用超线程可能是有益的,特别是如果低 IPC 的原因是延迟问题(例如指令延迟和缓存未命中)。不幸的是,这并不总是正确的。例如,以下代码使用超线程不应更快: for(int i=0 ; i<maxi ; ++i) out_array[i] += in_array[i];

这是因为英特尔处理器上通常有 1 个执行存储端口,并且它应该已经被 1 个超线程饱和(否则它应该受到内存吞吐量限制,这对于超线程来说并不是更好)。因此,使用更多的超线程不应提高执行时间。事实上,超线程引入了轻微的开销,这应该会导致执行速度稍微慢一些。

问题是应用程序通常比这复杂得多,并且人们不知道数学函数是如何实现的。因此,

开发人员在没有基本基准测试的情况下几乎不可能知道什么是最佳配置,除非计算内核很简单

© www.soinside.com 2019 - 2024. All rights reserved.