Visual C++ 7.1Visual Studio .NET 2003Windows 2003.NET 1.1Windows 2000Windows XP.NET 2.0中级开发Visual StudioWindowsC++.NETC#
计算物理和逻辑处理器数






2.76/5 (11投票s)
如何确定计算机上的物理和逻辑处理器数量。
引言
现代 Intel Pentium IV 处理器支持所谓的超线程模式。 通过超线程,一个真实的物理处理器向操作系统呈现为两个独立的逻辑处理器。 超线程技术减少了进程切换开销,提高了整体系统吞吐量。 但是在某些计算密集型应用程序中,这种两个逻辑处理器的假象可能会导致效率损失,如果程序启动两个并行线程,而这两个线程将争用一个物理处理器。 因此,我们必须确定我们的计算机中有多少个物理处理器,以便将并行线程的数量调整为物理处理器的数量。 后面的实用程序显示了我们如何从 C# 程序中做到这一点。
背景
CPU 计数实用程序基于以下 Intel 文档和代码示例
- 如何确定处理器是否支持超线程技术
- 如何将逻辑处理器与物理处理器相关联
- 我还使用了 Khang Nguyen 的文章中的 C++ 代码示例。
使用代码
CPU 计数实用程序由两部分组成 - 客户端部分和服务器部分。 用 C# 编写的客户端部分调用服务器函数并显示其结果。 服务器部分实际上确定处理器的数量。 它广泛使用 ASM 命令,因此用托管 C++ 编写。
客户端的关键部分是对服务器函数 GetCPUCount
的调用。
int LogicalNum = 0; // Number of logical CPU per ONE PHYSICAL CPU
int PhysicalNum = 0; // Total number of physical processor
CPUCountStatus HTStatusFlag = 0;
HTStatusFlag = CPUCount.GetCPUCount(ref LogicalNum, ref PhysicalNum);
不要忘记添加命名空间使用语句。
using CPUCounter;
服务器部分实现为一个单独的 DLL,包含类 CPUCount
的静态函数 GetCPUCount
。
// CPUCount.h
#pragma once
#using <mscorlib.dll>
using namespace System;
namespace CPUCounter
{
public __value enum CPUCountStatus
{
HT_NOT_CAPABLE,
HT_ENABLED,
HT_DISABLED,
HT_SUPPORTED_NOT_ENABLED,
HT_CANNOT_DETECT
};
public __value class CPUCount
{
public:
static CPUCountStatus GetCPUCount(int __gc* LogicalNum,
int __gc* PhysicalNum);
};
unsigned int HTSupported();
unsigned int LogicalProcPerPhysicalProc();
unsigned int GetAPIC_ID();
CPUCountStatus DefineCPUCount(int __gc* LogicalNum,
int __gc* PhysicalNum);
}
函数 GetCPUCount
返回 CPUCountStatus
enum
类型的值。 CPUCountStatus
值的含义是
HT_NOT_CAPABLE |
此系统中不存在超线程技术。 |
HT_ENABLED |
此系统中启用了超线程技术。 |
HT_DISABLED |
硬件中禁用了超线程技术。 |
HT_SUPPORTED_NOT_ENABLED |
支持超线程技术,但在 BIOS 中禁用。 |
HT_CANNOT_DETECT |
无法检测到超线程技术 |
要确定超线程的可能性以及计算机中物理和逻辑处理器的数量,只需将文件CPUCounterClient.exe 和 CPUCounter.dll 复制到某个目录并运行 CPUCounterClient.exe。
历史
这是 CPU 计数实用程序的第一个版本。