multithreading - 4 个内核的 8 个逻辑线程并行运行速度最多可提高 4 倍?

标签 multithreading openmp multicore hyperthreading

我正在基准测试软件,它在 Intel 2670QM 上的执行速度比我的串行版本快 4 倍,使用我的所有 8 个“逻辑”线程。我想要一些关于我对基准测试结果的看法的社区反馈。

当我在 4 个内核上使用 4 个线程时,我的速度提高了 4 倍,整个算法是并行执行的。这对我来说似乎合乎逻辑,因为“Amdhals 定律”预测了这一点。 Windows 任务管理器告诉我我正在使用 50% 的 CPU。

但是,如果我在所有 8 个线程上执行相同的软件,我将再次获得 4 倍的加速而不是 8 倍的加速。

如果我理解正确的话:我的 CPU 有 4 个内核,频率分别为 2.2GHZ,但是当应用于 8 个“逻辑”线程时,频率被分为 1.1GHZ,其余组件(例如高速缓存)也是如此?如果这是真的,那么为什么任务管理器声称我的 CPU 只使用了 50%?

#define NumberOfFiles 8
...
char startLetter ='a';
#pragma omp parallel for shared(startLetter)
for(int f=0; f<NumberOfFiles; f++){
    ...
}

我不包括使用磁盘 I/O 的时间。我只对 STL 调用花费的时间(STL 排序)而不是磁盘 I/O 感兴趣。

最佳答案

一个 i7-2670QM处理器有 4 个内核。但它可以并行运行 8 个线程。
这意味着它只有 4 个处理单元(核心),但在硬件上支持并行运行 8 个线程。这意味着在内核上最多运行四个作业,如果其中一个作业由于例如内存访问而停止,另一个线程可以非常快速地在空闲内核上开始执行,而损失很小。 Read more on Hyper threading .在现实中,很少有超线程带来巨大性能提升的场景。更现代的处理器比旧处理器更好地处理超线程。

您的基准测试表明它受 CPU 限制,即管道中几乎没有停顿会给超线程带来优势。 50% 的 CPU 是正确的,4 个内核正在工作,而 4 个额外的内核没有做任何事情。在 BIOS 中打开超线程,您将看到 100% CPU。

关于multithreading - 4 个内核的 8 个逻辑线程并行运行速度最多可提高 4 倍?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10403201/

相关文章:

c++ - 依赖于编译器的OpenMP最小/最大减少编译指示

c - 使用 OpenMP SECTIONS 指令时私有(private)变量打印为垃圾值

Android NDK 使用多核 cpu

randomForestSRC 包 R 中的 rfsrc() 命令不使用多核功能

c++ 理解多线程中的 lock_guard 和 mutex

syntax - 如何在 Fortran 中对数组使用归约?

ios - heightForRowAtIndexPath 中的线程问题

multithreading - Spark 如何在多核或超线程机器上实现一项任务内的并行性

java - 为什么 b.wait() 不让主线程等待

c++ - 零MQ与C++绑定(bind)和Open MP阻止问题。为什么?