Windows下CPU线程数的获取问题

LL596214569 2019-05-13 02:24:44
如何获取CPU的线程数?
SYSTEM_INFO si;
GetSystemInfo(&si);
m_nThreads = si.dwNumberOfProcessors;
这样写取到的是内核数,但是当CPU可以使用超线程时, CPU的线程数是这个内核数的2倍。
那么有没有办法直接取到CPU的线程数呢
...全文
374 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
LL596214569 2019-05-15
  • 打赏
  • 举报
回复
引用 11 楼 早打大打打核战争 的回复:
应该就是分组的原因,你可以用bcdedit /set groupsize xx改变一下分组大小试试,比如xx设成32
好的,十分感谢
  • 打赏
  • 举报
回复
应该就是分组的原因,你可以用bcdedit /set groupsize xx改变一下分组大小试试,比如xx设成32
LL596214569 2019-05-14
  • 打赏
  • 举报
回复
引用 9 楼 早打大打打核战争 的回复:
看它的例子,调用GetLogicalProcessorInformation获取一个指向SYSTEM_LOGICAL_PROCESSOR_INFORMATION结构数组的指针,遍历该数组,对每个结构,判断它的Relationship,如果是RelationProcessorCore,核数值+1,再判断ProcessorMask域,每个置1的位代表该核的一个逻辑处理器,所有核的逻辑处理器加起来就是全部逻辑处理器数量
好的,谢谢,这里我明白了; 但我还是没明白在我发的那个图的机器下GetSystemInfo为甚么取到的是48
  • 打赏
  • 举报
回复
看它的例子,调用GetLogicalProcessorInformation获取一个指向SYSTEM_LOGICAL_PROCESSOR_INFORMATION结构数组的指针,遍历该数组,对每个结构,判断它的Relationship,如果是RelationProcessorCore,核数值+1,再判断ProcessorMask域,每个置1的位代表该核的一个逻辑处理器,所有核的逻辑处理器加起来就是全部逻辑处理器数量
LL596214569 2019-05-14
  • 打赏
  • 举报
回复
引用 7 楼 早打大打打核战争 的回复:
你这是多路系统吧,有多颗物理处理器,看GetLogicalProcessorInformation下面的例子
是的,这是双路CPU,GetLogicalProcessorInformation的例子我看了; 所以你得意思是在多路CPU的设备下,GetSystemInfo取到的是单个CPU的信息,需要查找所有的物理处理器遍历获得总逻辑处理器数量?
  • 打赏
  • 举报
回复
你这是多路系统吧,有多颗物理处理器,看GetLogicalProcessorInformation下面的例子
LL596214569 2019-05-13
  • 打赏
  • 举报
回复
引用 4 楼 早打大打打核战争 的回复:
[quote=引用 3 楼 LL596214569 的回复:] [quote=引用 1 楼 早打大打打核战争 的回复:] dwNumberOfProcessors就是逻辑处理器数量,不是核心数 获取处理器物理封装数、核心数、线程数可以用GetLogicalProcessorInformation,msdn上有例子
我用4核8线程的电脑运行,dwNumberOfProcessors取到的是4,如果取到的是逻辑处理器数量不该是8吗[/quote] 估计你的电脑BIOS设置没开超线程,或者你在虚拟机里测试的 [/quote] 关于dwNumberOfProcessors,在MSDN上的解释是 The number of logical processors in the current group. To retrieve this value, use the GetLogicalProcessorInformation function. 其中提到了一个current group; 然后关于逻辑处理器有一段 Support for systems that have more than 64 logical processors is based on the concept of a processor group, which is a static set of up to 64 logical processors that is treated as a single scheduling entity. Processor groups are numbered starting with 0. Systems with fewer than 64 logical processors always have a single group, Group 0. 所以是否可能是因为我这台机器被分为了两个组,所以取到的dwNumberOfProcessors只是其中一个组的大小
LL596214569 2019-05-13
  • 打赏
  • 举报
回复
我用这台机器测试,肯定是开启了超线程的,系统win10最新版, GetSystemInfo(&si); si.dwNumberOfProcessors;取到的值就是48
  • 打赏
  • 举报
回复
引用 3 楼 LL596214569 的回复:
[quote=引用 1 楼 早打大打打核战争 的回复:]
dwNumberOfProcessors就是逻辑处理器数量,不是核心数
获取处理器物理封装数、核心数、线程数可以用GetLogicalProcessorInformation,msdn上有例子


我用4核8线程的电脑运行,dwNumberOfProcessors取到的是4,如果取到的是逻辑处理器数量不该是8吗[/quote]

估计你的电脑BIOS设置没开超线程,或者你在虚拟机里测试的

LL596214569 2019-05-13
  • 打赏
  • 举报
回复
引用 1 楼 早打大打打核战争 的回复:
dwNumberOfProcessors就是逻辑处理器数量,不是核心数 获取处理器物理封装数、核心数、线程数可以用GetLogicalProcessorInformation,msdn上有例子
我用4核8线程的电脑运行,dwNumberOfProcessors取到的是4,如果取到的是逻辑处理器数量不该是8吗
636f6c696e 2019-05-13
  • 打赏
  • 举报
回复
试试GetLogicalProcessorInformation https://docs.microsoft.com/zh-cn/windows/desktop/api/sysinfoapi/nf-sysinfoapi-getlogicalprocessorinformation
  • 打赏
  • 举报
回复
dwNumberOfProcessors就是逻辑处理器数量,不是核心数
获取处理器物理封装数、核心数、线程数可以用GetLogicalProcessorInformation,msdn上有例子

24,860

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧