相关疑难解决方法(0)

执行 Parallel.For 从数组计算数据的正确方法

想要:对 x 求和并对 x*x 求和。其中 x = 行[i]。因为多个线程想要读/写“sumAll”和“sumAllQ”,所以我需要锁定其访问权限。问题是锁类型在这里序列化了事物。我需要将此操作拆分为 #"Environment.ProcessorCount" for 循环,每个循环对数组的一部分求和,最后对它们的结果求和。但我怎样才能以编程方式实现呢?

示例代码:

//line is a float[]
Parallel.For(0, line.Length,
new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount },
i =>
{
    x = (double)line[i];
    lock (sumLocker)
    {
        sumAll += x;
        sumAllQ += x * x;
    }
});
Run Code Online (Sandbox Code Playgroud)

编辑 1:Matthew Watson 回答基准结果

在家里。CPU 核心 2 四核 Q9550 @ 2.83 GHz:

Result via Linq:      SumAll=49999950000, SumAllQ=3,33332833333439E+15
Result via loop:      SumAll=49999950000, SumAllQ=3,33332833333439E+15
Result via partition: SumAll=49999950000, SumAllQ=3,333328333335E+15
Via Linq took: 00:00:02.6983044
Via Loop took: 00:00:00.4811901
Via …
Run Code Online (Sandbox Code Playgroud)

c# parallel-processing locking .net-4.0

2
推荐指数
1
解决办法
2880
查看次数

标签 统计

.net-4.0 ×1

c# ×1

locking ×1

parallel-processing ×1