我正在运行 64 位 Windows Server 2008 R2 Enterprise 的服务器上测试一个程序,它有 4 个 Intel E7-4870 处理器,总共 40 个内核和 80 个可用线程(我可以在 Windows 任务管理器中看到 80 个 CPU 使用率图)。
程序代码如下:
numlist is List 包含数百个数字,每个数字都是用于某些计算的参数
Parallel.ForEach(numlist, num =>
{
// do some calculation using parameter = num
});
问题是当我在服务器上运行这个程序时,只有一半的可用线程显示在 Windows 任务管理器中使用(当然 CPU 使用率显示为 50%),其余 40 个完全未使用且处于空闲状态.
我还在另一台只有 2 个处理器和总共 24 个可用线程的服务器上测试了相同的程序,所有 24 个线程都将被完全使用,CPU 使用率显示为 100%。
有什么办法可以让 40 核 CPU 服务器运行该程序并充分利用其所有可用的 80 个线程(或接近 80 个线程)?仅使用 50% 的 CPU 资源时性能不够好。
这是我正在测试的完整程序代码:
namespace Test
{
internal class Program
{
private static void Main(string[] args)
{
Console.WriteLine("Press any key to start");
Console.ReadLine();
List<int> numlist = new List<int>();
for (int i = 0; i < 100; i++)
{
numlist.Add(i);
}
Parallel.ForEach(numlist, num =>
{
while (true)
{
num++;
}
});
}
}
}
当它在具有 2 个 Intel X5690 处理器(总共 24 个线程可用)的服务器上运行时,所有 24 个线程都被使用,并且 CPU 使用率显示为 100%;
但是当我在有 80 个线程的 4 处理器服务器上运行它时,只使用了 40 个线程,CPU 使用率只有 50%。是否有任何与此相关的编译器设置?