1. 环境
机器1:Intel(R) Core(TM) i5-4200H CPU @ 2.80GHz,双核四线程,win10 x64,16G内存
机器2:Intel(R) Core(TM) i3-9100T CPU @ 3.10GHz,四核四线程。wn10 x64,8G内存
目的:大概测试一下2C4T与4C4T在计算密集型任务下的效率提升对比,内存大小、频率暂且忽略。
方法:使用openMP控制计算任务中的线程使用数量,测试12层for循环所消耗的时间(12是1、2、3、4的公倍数,防止openMP分配任务不均)。实际是测120层的耗时,再除以10。
2. 代码
环境:
#include <iostream>
#include <omp.h>
using namespace std;
const int N = 1e9;
int main() {
int ans = 0;
int peat = 120;
double start = omp_get_wtime();
#pragma omp parallel for num_threads(1)
for (int i = 0; i < peat; ++i) {
for (int j = 0; j < N; ++j) {
++ans;
}
}
double end = omp_get_wtime();
// 计算12层for循环所消耗的时间
cout << "time: " << (end - start)/10 << endl;
return 0;
}
3. 结果
机器1(2C4T):
线程数 | 耗时(秒) |
---|---|
1 | 2.0653 |
2 | 1.37322 |
3 | 1.15472 |
4 | 1.10587 |
机器2(4C4T):
线程数 | 耗时(秒) |
---|---|
1 | 1.72509 |
2 | 0.877413 |
3 | 0.618491 |
4 | 0.49988 |
在双核四线程的机器上,单线程执行与双线程执行有明显的效率提升,但是当线程数开到3、4时,效率提升几乎可以忽略不计。原因在于,双核四线程,真正的核心只有2个,也就只有两个物理线程。多出来的两个线程是模拟出来的。但是,这种计算密集型的任务,类似等待IO这种耗时的操作也比较少,核心也就不会切换,虚拟出来的线程几乎派不上用场。所以,最多就是两个线程的效率。
而,四核四线程,是实打实的四个线程在工作。从任务耗时来看,所消耗的时间与线程数量成反比,4线程的仅是1线程耗时的四分之一,4倍左右的效率提升。