【发布时间】:2012-05-01 19:35:52
【问题描述】:
我正在使用我的所有 8 个“逻辑”线程在 Intel 2670QM 上执行比我的串行版本快 4 倍的基准测试软件。我想就我对基准测试结果的看法获得一些社区反馈。
当我在 4 个内核上使用 4 个线程时,我的速度提高了 4 倍,整个算法是并行执行的。这对我来说似乎是合乎逻辑的,因为“阿姆达尔定律”预测了这一点。 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。
【问题讨论】:
-
根据我的经验,4 核意味着您可以同时做 4 件事而不受惩罚。 8 个线程只是意味着两个线程共享一个内核(假设它们是均匀分布的),因此除非您的代码内置了一些并行性,否则您可能看不到
threads == cores以上的任何速度提升。您的结果还取决于您的算法是受处理器限制还是受 I/O 限制。总之,事情没有你想的那么简单。 -
在某些硬件上,每个线程都有一些处理器单元的多个实例,但不是全部(例如只有一个 FPU)。取决于硬件,尽管额外的“线程”将比在更大的可运行进程集之间进行上下文切换更便宜(您不必在每次切换时都复制所有状态)。
标签: multithreading openmp multicore hyperthreading