我在 Linux 2.6.39 x86_64 上的 Core i7 930 @2.8GHz(四核)上对在 BIOS 中启用和禁用超线程的 wine 编译时间进行了多次测量。每次测量都是这样的:
git clean -xdf
./configure --prefix=/usr
time make -j$N
其中 N
是从 1 到 8 的数字。
结果如下(“速度”为 60/真实时间(1)):
此处,蓝线对应于 HT 禁用,紫色线对应于 HT 启用。看起来,当启用 HT 时,使用 1-4 个线程比不使用 HT 慢。我想这可能与内核没有将进程分配到不同的核心并重用已经繁忙的核心的第二个线程有关。
所以,我的问题是:如何强制内核为每个核心调度 1 个进程提供比向同一核心的不同线程添加更多进程更高的优先级?或者,如果我的推理是错误的,对于并行运行的 1-4 个进程,如何使用 HT 获得不比没有 HT 更差的性能?
最佳答案
英特尔芯片上的超线程是通过复制物理核心的某些元素来实现的,但没有足够的电子设备来成为独立的核心(例如,它们可能共享指令解码器,但我不记得英特尔实现的具体细节)。
将具有 HT 的物理核心镜像为 1.5 个物理核心,您的操作系统将其视为 2 个真实核心。但这并不等于 1.5 倍的速度(这可能会根据用例而变化)
在您的示例中,非 HT 的速度最多可达 4 个线程,因为没有内核与其 HT 管道共享工作。您会在 4 个线程上方看到一条平坦线,因为现在您只有 4 个执行线程,并且线程之间的上下文切换会产生一些额外的开销。
在 HT 示例中,最多 4 个线程时速度会慢一些,可能是因为其中一些线程被分配给真正的核心并且它是 HT,因此由于这两个执行线程共享物理资源,您会损失性能。在 4 个线程以上,您会看到额外执行线程的好处,但您会看到 yield 递减的开始。
您可能可以在这两种情况下使用最多 4 个线程来匹配性能,但可能无法通过编译作业来匹配。我认为,为了设置处理器亲和性而产生了许多进程。如果您使用 OpenMP 或 MPI 运行真正的并行作业,其中 X<=4 线程绑定(bind)到特定的真实 CPU 核心,我认为您会看到 HT-off 和 -on 之间的性能相似。
关于performance - 为什么使用 HT 的并行编译性能比不使用 HT 时差?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20640193/