在Delphi中,我们需要知道用于并行化的CPU数量。到目前为止,我们已经使用了GetNativeSystemInfo()
函数,该函数在带有超线程的服务器上也能正常工作。
但是现在,我们有一台服务器(Intel Xeon Gold 6230)具有40个物理处理器和80个具有超线程的逻辑处理器,而GetNativeSystemInfo()
仅显示40个CPU。
我们制作了一个使用3个调用的小型测试程序:
GetNativeSystemInfo()
GetLogicalProcessorInformation()
(来自How to detect number of logical and physical processors efficiently?的代码)
并查看注册表中的CPU数量:
计算机\ HKEY_LOCAL_MACHINE \硬件\ DESCRIPTION \ System \ CentralProcessor
对于我们所有的服务器,这3个调用给出了相同数量的CPU:
但是对于Intel Xeon,只有注册表为我们提供了80个CPU:
有人知道为什么它不能在Intel服务器上运行,还是知道一种确保获得最大CPU数量的方法?
答案 0 :(得分:9)
在GetLogicalProcessorInformation
文档中,我找到了这一部分:
在具有64个以上逻辑处理器的系统上, GetLogicalProcessorInformation函数检索逻辑处理器 有关processor group中的处理器的信息, 当前已分配调用线程。使用
GetLogicalProcessorInformationEx
函数来检索信息 关于系统上所有处理器组中的处理器的信息。
因此,请尝试使用GetLogicalProcessorInformationEx
。
答案 1 :(得分:2)
要查询大于64的逻辑处理器,您必须使用更新的GetLogicalProcessorInformationEx
API,NumCPULib4Pascal库以易于使用的方式包装了该API。
不幸的是,我无法在此处粘贴完整的代码,因为它不适合StackOverflow的字数限制。
下面的示例用法:
uses
NumCPULib;
var
lcc, pcc: Int32;
begin
// count logical cpus
lcc := TNumCPULib.GetLogicalCPUCount();
// count physical cpus
pcc := TNumCPULib.GetPhysicalCPUCount();
end;