multithreading – 每个内核的线程数

我有这个代码:

#define threadsNum 4 DWORD WINAPI func(LPVOID vpParam) { long long sum = 0; for(int i = 0; i < 400000 / threadsNum; i++) { for(int j = 0; j < 160000 / threadsNum; j++) { sum = sum > 1000 ? 0 : sum + 1; } } return 1; } int main() { clock_t timer = clock(); int CPUs = 4; DWORD_PTR threadCore = 1; DWORD_PTR threadID = 0; int addNum = 0; void* *threads = new void*[threadsNum]; for (int i = 0; i < threadsNum; i++) { threadCore = 1 << addNum; addNum++; if (addNum == 4) addNum = 0; threads[i] = CreateThread(0, 0, func, NULL , 0, &threadID); SetThreadAffinityMask(threads[i], threadCore); } if (WaitForMultipleObjects(threadsNum, threads, true, INFINITE) == WAIT_FAILED) FatalAppExitA(NULL, "FAIL"); cout<<clock() - timer<<endl; getchar(); return 1; } 

我的电脑上有4个内核。 随着threadsNum数量的增加,时间threadsNum 。 当threadsNum等于4时,输出是22325,当它是8时,输出是11549.为什么? 每个核心都做同样的工作。 对于threadsNum = 8每个核心有2个线程,当threadsNum = 4时它们一起执行相同的工作。 那么为什么它更快?

如果在4核CPU上8个线程比4个速度快得多,那么你可能有一个带超线程的Intel CPU,每个核心运行两个硬件线程。 它通常不像实际的8核CPU那么快,因为每个核心上的两个线程共享一些硬件资源,但对于这样一个简单的线程负载,可能会接近2倍的提高(似乎是这样做)。

有2个主要的罪魁祸首,但你将不得不更多的基准,找出每个贡献。

  1. IO绑定的任务,其中线程被IO阻塞。 在这种情况下,“IO”将是内存访问。 一个线程可以添加,另一个线程阻塞等待读取或写入。
  2. 超线程 。 在现代处理器中,每个核心几乎可以表现得像两个核心。