2013-12-22 90 views
1

我想创建一个小型测试,用于执行一些计算以查看处理器的完成速度。例如,我想获取一台机器的CPU信息,然后运行像这样一个试验:如何在多个内核/处理器上分割工作

public static double SumRootN(int root) 
    { 
     double result = 0; 
     for (int i = 1; i < 10000000; i++) 
     { 
      result += Math.Exp(Math.Log(i)/root); 
     } 
     return result; 
    } 

    private void buttonStart_Click(object sender, EventArgs e) 
    { 
     labelPhysicalProcessors.Text = ""; 
     labelProcessorName.Text = ""; 
     labelLogicalProcessors.Text = ""; 
     labelCores.Text = ""; 

     this.Cursor = Cursors.WaitCursor; 

     string physicalProcessors = String.Empty; 
     string processorName = String.Empty; 
     string logicalProcessors = String.Empty; 
     string coreCount = String.Empty; 

     foreach (var item in new System.Management.ManagementObjectSearcher("Select * from Win32_ComputerSystem").Get()) 
     { 
      physicalProcessors = item["NumberOfProcessors"].ToString(); 
      logicalProcessors = item["NumberOfLogicalProcessors"].ToString(); 
     } 


     foreach (var item in new System.Management.ManagementObjectSearcher("Select * from Win32_Processor").Get()) 
     { 
      coreCount = item["NumberOfCores"].ToString(); 
      processorName = item["Name"].ToString(); 
     } 

     labelPhysicalProcessors.Text = physicalProcessors; 
     labelProcessorName.Text = processorName; 
     labelLogicalProcessors.Text = logicalProcessors; 
     labelCores.Text = coreCount; 

     var watch = Stopwatch.StartNew(); 


     Parallel.For(2, 20, (i) => 
     { 
      var result = SumRootN(i); 
      //Console.WriteLine("root {0} : {1} ", i, result); 
     }); 


     labelTime.Text = watch.ElapsedMilliseconds.ToString() + " ms"; 


     this.Cursor = Cursors.Arrow; 

    } 

这将产生: enter image description here

我想借此对CPU内核和逻辑处理器数量的优势。我该如何在C#中完成这项工作,即如果一个machie拥有更多的核心,那么我想将工作分解到每个核心上,这样具有更多核心和逻辑处理器的机器就可以更快地运行测试。

+2

'Parallel.For'应该已经做了类似于你所问的事情......有什么不适合那个? –

+0

感谢您的回复。我的解决方案很有用,但我想确保我专门给每个核心提供部分工作。我想构建一个可靠的测试工具,我可以用它来“测试”不同类型的处理器。 –

+0

国际海事组织更适合codereview.stackexchange.com – Rotem

回答

1

如果你正在构建一个基准,你应该严格控制线程。手动启动N个线程,其中N为Environment.ProcessorCount。甚至不要使用Task设施,因为它可以减少公平性保证。

您可能想要增加线程优先级以减少上下文切换引起的时序抖动。

+0

如果我启动N个线程,那么我怎样才能保证每个线程都能在每个处理器上运行? –

+0

操作系统做到这一点。如果您将核心数量与相同数量的线程相匹配,并且您没有在系统中执行重要的其他活动,则调度开销可以忽略不计。 – usr

相关问题