我在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个时才有效)