【问题标题】:How to split work over multiple cores/processors如何在多个内核/处理器上拆分工作
【发布时间】:2013-12-22 18:13:38
【问题描述】:

我想创建一个小测试来执行一些计算,以查看处理器完成它的速度。例如,我想获取机器的 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;

    }

这会产生:

我想利用 CPU 上的内核和逻辑处理器的数量。如何在 C# 中执行此操作,即如果机器有更多内核,那么我想将工作拆分到每个内核上,以便具有更多内核和逻辑处理器的机器更快地运行测试。

【问题讨论】:

  • Parallel.For 应该已经做了与您所要求的类似的事情......什么不起作用?
  • 感谢您的回复。我的解决方案有效,但我想确保我专门将部分工作分配给每个内核等。我想构建一个可靠的测试工具,可用于“基准测试”不同类型的处理器。
  • IMO 更适合 codereview.stackexchange.com
  • 例如,如果我有 8 个逻辑处理器,我想将我的任务分成 8 个并为每个逻辑处理器分配一个任务,从而减少总时间。

标签: c# parallel-processing task-parallel-library


【解决方案1】:

如果您正在构建基准测试,您应该严格控制线程。手动启动 N 个线程,其中 N 为 Environment.ProcessorCount。甚至不要使用 Task 工具,因为它提供的公平性保证较少。

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

【讨论】:

  • 如果我启动 N 个线程,那么我如何保证每个线程都会在每个处理器上运行???
  • 操作系统会这样做。如果您将内核数量与相同数量的线程相匹配,并且系统中没有重要的其他活动正在进行,那么调度开销可以忽略不计。
猜你喜欢
  • 1970-01-01
  • 2018-07-13
  • 2014-12-28
  • 2015-05-26
  • 2015-11-08
  • 1970-01-01
  • 1970-01-01
  • 2019-09-29
  • 1970-01-01
相关资源
最近更新 更多