我在 Windows 上使用 OpenMP 和 MinGW。GCC 版本 7.2.0 x86-64-posix-sev-rev1,由 MinGW-W64 项目构建。在运行 Windows Server 2016 的具有 2 x Xeon E5-2699 V4 的计算机上。我正在运行:
printf("%d ", omp_get_num_procs());
printf("%d ", omp_get_max_threads());
printf("%d ", omp_get_thread_limit());
printf("%d ", omp_get_proc_bind());
产生:
44, 44, 2147483647, 0
超线程共有 44 个物理内核。OpenMP 根本看不到其中一个 CPU。
编辑:在确认相同的代码与 CLang 正常工作并查看 libgomp 的源代码后,我发现它与 libgomp 的实现有关。他们使用旧方法来计算 Windows 上的处理器(迭代 GetProcessAffinityMask 的输出,仅当系统上的逻辑核心少于 64 个时才有效)