gpt4 book ai didi

c# - 多个 Parallel.ForEach 调用,MemoryBarrier?

转载 作者:太空狗 更新时间:2023-10-29 23:21:49 29 4
gpt4 key购买 nike

我有一堆数据行,我想使用 Parallel.ForEach 像这样计算每一行的一些值...

class DataRow
{
public double A { get; internal set; }
public double B { get; internal set; }
public double C { get; internal set; }

public DataRow()
{
A = double.NaN;
B = double.NaN;
C = double.NaN;
}
}

class Program
{
static void ParallelForEachToyExample()
{
var rnd = new Random();
var df = new List<DataRow>();

for (int i = 0; i < 10000000; i++)
{
var dr = new DataRow {A = rnd.NextDouble()};
df.Add(dr);
}

// Ever Needed? (I)
//Thread.MemoryBarrier();

// Parallel For Each (II)
Parallel.ForEach(df, dr =>
{
dr.B = 2.0*dr.A;
});

// Ever Needed? (III)
//Thread.MemoryBarrier();

// Parallel For Each 2 (IV)
Parallel.ForEach(df, dr =>
{
dr.C = 2.0 * dr.B;
});
}
}

(在这个例子中,不需要并行化,如果有的话,它可以全部放在一个 Parallel.ForEach 中。但这意味着是一些代码的简化版本,像这样设置它是有意义的).

是否可以在此处重新排序读取,以便我最终得到 B != 2A 或 C != 2B 的数据行?

假设第一个 Parallel.ForEach (II) 分配工作线程 42 处理数据行 0。第二个 Parallel.ForEach (IV) 分配工作线程 43 处理数据行 0(第一个 Parallel.ForEach (IV) 分配工作线程 43 处理数据行 0)。 ForEach 完成)。是否有可能在线程 43 上读取第 0 行的 dr.B 返回 double.NaN,因为它还没有看到来自线程 42 的写入?

如果是这样,在 III 处插入内存屏障是否有帮助?这会强制第一个 Parallel.ForEach 的更新在第二个 Parallel.ForEach 开始之前对所有线程可见吗?

最佳答案

工作由 Parallel.ForEach() 开始将在它返回之前完成。在内部,ForEach()产生一个 Task对于每次迭代,并调用 Wait()在每一个上。因此,您不需要在 ForEach() 之间同步访问电话。

对于使用 ForEach() 的单个任务,您确实需要记住这一点允许您访问循环状态、聚合任务结果等的重载。例如在这个简单的例子中,它总结了 1 ≤ x ≤ 100。 , Action传递给 localFinallyParallel.For()不得不关心同步问题,

var total = 0;

Parallel.For(0, 101, () => 0, // <-- localInit
(i, state, localTotal) => { // <-- body
localTotal += i;
return localTotal;
}, localTotal => { <-- localFinally
Interlocked.Add(ref total, localTotal); // Note the use of an `Interlocked` static method
});

// Work of previous `For()` call is guaranteed to be done here

Console.WriteLine(total);

在您的示例中,没有必要在 ForEach() 之间插入内存屏障。电话。具体来说,循环 IV可以取决于 II 的结果正在完成,并且Parallel.ForEach()已插入 III为你。

摘自:Parallel Framework and avoiding false sharing

关于c# - 多个 Parallel.ForEach 调用,MemoryBarrier?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30250980/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com