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

Parallel processing 根据处理器内核,我应该在.net中使用多少任务?,parallel-processing,Parallel Processing,我有一个奔腾(R)双核CPU E5200 2/50GHz 这意味着我有两个核心。我开发了一种智能算法的并行方法 我通过将数据集拆分为X个部分(X=.net任务数)来实现数据并行。我为每个任务提供一组数据 我试过使用2、4、8和16个任务,但我看不到算法有任何改进。当然,该算法的并行方法比串行(原始)方法更快,但从2个任务到16个任务都没有改进。他们的表演都一样。我不知道我是否做错了什么,或者CPU的容量有那么大(任务的数量是多少并不重要?) 为了更实用,下面是我的一些代码,它们描述了我实际上在做

我有一个奔腾(R)双核CPU E5200 2/50GHz

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

我通过将数据集拆分为X个部分(X=.net任务数)来实现数据并行。我为每个任务提供一组数据

我试过使用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
    }
while(迭代startParallelMethod(迭代,tasks[val],SOMState.dataset.GroupedData[val],tasks[val].Map,SOMState.dataset.GroupedDataDictionary[val]);
添加(t1);
tdd++;
}
等待任务。WhenAll(netTasks);
//在这里做些事情
迭代++;
}
public void startParallelMethod(int迭代、任务数据任务、列表数据集、地图映射、字典数据集)
{
//它在这里执行一些处理
}
一个任务是否使用处理器的一个核心

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

更新:


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

作为评论的后续:除非我遗漏了什么,而不是

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++;
}
您可以编写(请注意:伪代码!)

当您的原始代码使用wait时,您可以将Parallel.For代码包装在Task.Run()中,其行为在方法之外应该是相同的(尽管这与您的初始示例相同,与使用异步wait的最佳实践相去甚远)


尽管如此,只要稍作改动,您就可以让运行时决定要使用多少任务。

对于可能感兴趣的人:

在完成一些实验后,以下是使用core i7处理器的结果。结果表明,使用6个任务(处理器的内核数)执行的速度最快。当我说使用6个任务时,我的意思是将我的数据集分成6组;每组将被分配一项任务。我们也可以使用平行法,因为正如我接受的答案所暗示的那样

图中显示了不同数据集(不同数量的输入)的结果。从5000到100000个输入数据开始,用于不同数量的任务。如果使用Environment.ProcessorCount任务,您可以很容易地发现(从表中,或者您可以自己尝试)

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


p.S.Environment.ProcessorCount返回整数值(处理器的内核数)。“数据组”还表示创建的任务数

您是否无法使用诸如
Parallel.ForEach等框架工具?您认为手动在任务之间划分工作会做得更好,这有什么原因吗?只是一个提示:如果您的代码受CPU限制,您可以使用Parallel.For/Parallel.Foreach,并让运行时决定并行化的程度。嗯,我需要检查一下我是否可以在代码中使用Parallel.Foreach。谢谢你的回答:)@Linky我不能使用Parallel。因为我在循环中使用了很多共享变量。更改代码并使其与并行程序一起工作是非常复杂的。因为我认为这是一样的,因为“任务”是我将要使用的任务数(用户定义)。根据tasks.count,我将庞大的数据集拆分为tasks.count组。然后,每组数据(SOMState.dataset.GroupedData[val])作为startParallelMethod方法的一个参数给出。此方法将处理作为参数给定的一组数据。如果我有n个任务,这意味着我将使用n个不同的数据集(数据组)调用startParallelMethod n次,startParallelMethod将被称为tasks.count times with tasks.count与tasks.count.net tasks的不同数据。可能我没有正确理解原始问题:在原始代码中,startParallelMethod似乎是通过使用Task.Factory.StartNew并行执行的。All In All tasks。将启动运行startParallelMethod的计数任务。到目前为止这是正确的吗?与此相反,使用Parallel.For将执行几乎相同的操作—运行startParallelMethod task.Count times—只不过它关心并发启动/运行的次数。这不是问题所在吗?是的,你说的都是真的。我的问题是:“任务数”应该是多少,换句话说就是“我应该将原始数据集拆分为多少组”?我有一个数据集(SOMState.dataset),为了并行化我的算法,我将其拆分为tasks.count组(SOMState.dataset.GroupedData)。如果我将原始数据集分成4组,我将从4个不同的任务中调用startParallelmethod 4次。通过这种方式,我试图通过将数据集拆分为4个.net任务来更快地执行算法。每个任务将执行原始数据集的一个子组I理解您所说的一切,I w
Parallel.For(0, tasks.Length, val => { 
    startParallelMethod(iteration, tasks[val], SOMState.dataset.GroupedData[val], tasks[val].Map, SOMState.dataset.GroupedDataDictionary[val])
});