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倍左右的效率提升。