2

可能重复:
如何通过 .NET/C# 查找 CPU 核心数?

我有一个控制多进程测试环境的程序。它的工作原理是确定系统上有多少可用内核,并创建与内核一样多的作业。执行此操作的代码如下:

string NumberOfProcesses = Environment.GetEnvironmentVariable("NUMBER_OF_PROCESSORS");

该机器是运行 Windows Server 2008 R2 HPC 版的 64 核 AMD Opteron 6276(4x16 核)。现在问题来了。从命令行我得到以下信息:

>echo %NUMBER_OF_PROCESSORS%
64

哪个是对的。在 C# 中运行上面的代码行给了我 32。Environments.ProcessorCount 也给了我 32。我尝试了一个在检测处理器数量中找到的代码块,但这给出了相同的响应(实际上是 31...31 免费,加上一个代码正在执行)。

测试表明它确实返回了 32 个核心。运行程序显示 CPU 利用率为 50%。如果我将 64 硬编码到程序中,CPU 利用率将变为 100%。不幸的是,我不能保持硬编码,因为这个程序可以在一系列硬件上运行。我想知道这是否与 AMD 的设计有关,因为 CPU-Z 检测到 4 个物理处理器,每个处理器有 8 个内核。但是它检测到 16 个线程。我想知道 C# 是否认为它是超线程的或类似的东西。有什么想法可以让它正确识别所有 64 个内核吗?

4

0 回答 0