【发布时间】:2019-01-05 08:58:51
【问题描述】:
我有一个复杂的程序,它应该使用所有内核来执行复杂的数学计算。
我有一个带有两个 Intel Xeon Platinum 8160 的系统。他们每个人都有24 cores,所以我在一起有48 cores和96 threads。
我的程序只使用24 cores 而不是所有48。它适用于第一个 CPU 的 24 或第二个 CPU 的 24,但不是全部一起使用。
当我启动程序的第二个实例时,没有任何变化,只使用了一个 CPU。
我附上一些截图。
我将一些代码提取到一个最小的工作示例中,该示例检查有多少线程可用。仅检测到 48 而不是所有 96 threads。
#include <stdlib.h>
#include <stdio.h>
#include <winsock.h>
#include <math.h>
#include <process.h>
static void thread_start(void *thread) {
int i;
i = *(int*)thread;
for (;;) {
i = (int)sqrt(i++);
}
}
int main (int argc, char * argv[]) {
SYSTEM_INFO sysi;
int thread_max, i;
argc = argc;
argv = argv;
GetSystemInfo(&sysi);
thread_max = sysi.dwNumberOfProcessors;
printf("\n... thread_max=%d\n", thread_max);
printf("\n\n");
for (i = 0; i < thread_max *2; i++) {
_beginthread(thread_start, 0, &i);
}
for (;;) i = i;
// return EXIT_SUCCESS;
}
我的机器在 Windows 10 64-bit Pro 下运行。可能是什么问题?
【问题讨论】:
-
任务管理器中设置的亲和力是什么意思?
-
什么是设置亲和力?
-
在哪里可以查到?
-
一台拥有这么多内核的机器使用 numa 架构,独立的处理器芯片每个都有自己的内存总线,当数据需要从一个到另一个时,需要使用互连粘合在一起。尽管出于不同的原因,这些处理器也包含在 winapi 中,但它们被组织成不同的组。每个组不能超过 64 个核心。您只使用一组,因此只能看到一半的核心。 docs.microsoft.com/en-us/windows/desktop/procthread/…
标签: c windows multithreading ansi-c