根据处理器核心,我应该在.net中使用多少个任务?

时间:2014-05-05 13:23:39

标签: parallel-processing

我有Pentium(R)双核CPU E5200 2 / 50GHz。

这意味着我有两个核心。我已经为智能算法开发了一种并行方法。

我通过将数据集拆分为X部分(X = .net Tasks的数量)来进行数据并行化。我正在为每项任务提供一组数据。

我尝试过使用2,4,8和16个任务,但我看不出算法有任何改进。当然,算法的并行方法比串行(原始)方法快,但从2个任务开始到16个没有任何改进。他们都表现相同。我不知道天气我做错了什么或者CPU容量是那么多(而且任务的数量无关紧要?)。

为了更实际,以下是我的一些代码,它描述了我实际在做什么:

  while (iteration < SOMState.Map.numbOfIterations)
        {
            netTasks.Clear(); // netTaks contains all the tasks that I creat inside the loop
            int tdd = 0;
            foreach (TasksData td in tasks)
            {
                int val = tdd;
                Task t1 = Task.Factory.StartNew(() => startParallelMethod(iteration, tasks[val], SOMState.dataset.GroupedData[val], tasks[val].Map, SOMState.dataset.GroupedDataDictionary[val]));
                netTasks.Add(t1);
                tdd++;
            }

         await Task.WhenAll(netTasks);
         // do some stuff here
         iteration++;
        }


    public void startParallelMethod(int iteration,TasksData task,List<GenerateDataSetFromCSV.Vector> dataset, Map map, Dictionary<int, List<Double>> dictionaryDataset)
    {
        // it performs some processing in here
    }

一个任务是否使用一个处理器核心?

Environment.ProcessorCount给了我2.这是否意味着无论任务的数量是多少,性能仍然就像我使用了2个任务一样?!

更新

对于那些可能感兴趣的人,我已回答了我自己的问题。

2 个答案:

答案 0 :(得分:0)

作为评论的后续行动:除非我遗漏了某些内容,而不是

int tdd = 0;
foreach (TasksData td in tasks)
{
    int val = tdd;
    Task t1 = Task.Factory.StartNew(() => startParallelMethod(iteration, tasks[val], SOMState.dataset.GroupedData[val], tasks[val].Map, SOMState.dataset.GroupedDataDictionary[val]));
    netTasks.Add(t1);
    tdd++;
}

你可以写(请注意:伪代码!)

Parallel.For(0, tasks.Length, val => { 
    startParallelMethod(iteration, tasks[val], SOMState.dataset.GroupedData[val], tasks[val].Map, SOMState.dataset.GroupedDataDictionary[val])
});

当您的原始代码使用等待时,您可以在Task.Run()中包装Parallel.For代码,并且它的行为应该在方法之外相同(尽管这与您的初始样本相同,远离最佳实践使用async-await)。

尽管如此 - 只需要很少的更改,您就可以让运行时决定要使用多少任务。

答案 1 :(得分:0)

对于那些可能感兴趣的人:

在进行一些实验后,这里是使用核心i7处理器的结果。它表明使用6个任务(处理器的核心数)表现最快。当我说使用6个任务时,我的意思是将我的数据集分成6组;每个小组将被赋予一项任务。我们也可以使用Parallel.For作为我接受的答案。

Table of results

在图像中,显示了不同数据集(不同输入数量)的结果。从5000到100000输入数据和不同数量的任务。您可以轻松找到(从表中,或者您可以自己尝试),如果您使用Environment.ProcessorCount任务执行速度最快。

作为结论,结果表明使用Environment.ProcessorCount是一种很好的做法。每个.NET任务都将处理(独立于程序员)它将要创建的线程数(在引擎盖下)。

P.S。 Environment.ProcessorCount返回整数值(处理器的核心数)。 &#34;数据组&#34;也表示创建的任务数量