我有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个任务一样?!
更新
对于那些可能感兴趣的人,我已回答了我自己的问题。
答案 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作为我接受的答案。
在图像中,显示了不同数据集(不同输入数量)的结果。从5000到100000输入数据和不同数量的任务。您可以轻松找到(从表中,或者您可以自己尝试),如果您使用Environment.ProcessorCount任务执行速度最快。
作为结论,结果表明使用Environment.ProcessorCount是一种很好的做法。每个.NET任务都将处理(独立于程序员)它将要创建的线程数(在引擎盖下)。
P.S。 Environment.ProcessorCount返回整数值(处理器的核心数)。 &#34;数据组&#34;也表示创建的任务数量