【发布时间】:2014-05-05 13:23:39
【问题描述】:
我有一个 Pentium(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
}
一项任务是否使用一个处理器核心?
Environment.ProcessorCount 给了我 2。这是否意味着无论任务数量是多少,性能仍然就像我使用了 2 个任务一样?!
更新:
对于那些可能感兴趣的人,我已经回答了我自己的问题。
【问题讨论】:
-
您不能使用
Parallel.ForEach等框架设施吗?您认为手动分配任务之间的工作会做得更好吗? -
提示:如果您的代码受 CPU 限制,您可以使用 Parallel.For / Parallel.Foreach 并让运行时决定它应该并行化的程度
-
嗯,很有趣。好吧,我需要检查一下是否可以在我的代码中使用 Parallel.Foreach。谢谢你的回答:)
-
@Linky 我不能使用 Parallel.For 因为我在循环中使用了很多共享变量。更改代码并使其适应 Parallel.For 非常复杂