gpt4 book ai didi

c# - Parallel.For 中的内存屏障

转载 作者:太空狗 更新时间:2023-10-29 20:53:57 24 4
gpt4 key购买 nike

Microsoft's documention of Parallel.For包含以下方法:

static void MultiplyMatricesParallel(double[,] matA, double[,] matB, double[,] result)
{
int matACols = matA.GetLength(1);
int matBCols = matB.GetLength(1);
int matARows = matA.GetLength(0);

// A basic matrix multiplication.
// Parallelize the outer loop to partition the source array by rows.
Parallel.For(0, matARows, i =>
{
for (int j = 0; j < matBCols; j++)
{
double temp = 0;
for (int k = 0; k < matACols; k++)
{
temp += matA[i, k] * matB[k, j];
}
result[i, j] = temp;
}
}); // Parallel.For
}

在这个方法中,可能有多个线程从 matAmatB 中读取值,它们都是在调用线程上创建和初始化的,并且可能有多个线程将值写入 result,稍后由调用线程读取。在传递给 Parallel.For 的 lambda 中,数组读写没有显式锁定。因为此示例来自 Microsoft,所以我假设它是线程安全的,但我试图了解幕后发生的事情以使其成为线程安全的。

根据我阅读的内容和我在 SO 上提出的其他问题(例如 this one ),据我所知,需要几个内存屏障才能使这一切正常进行。它们是:

  1. 在创建和初始化 matAmatB 之后调用线程上的内存屏障,
  2. 在从 matAmatB 读取值之前,每个非调用线程上的内存屏障,
  3. 在将值写入result 之后,每个非调用线程上的内存屏障,以及
  4. 在从 result 中读取值之前调用线程上的内存屏障。

我的理解正确吗?

如果是这样,Parallel.For 是否以某种方式完成所有这些?我深入研究了引用资料,但在跟踪 the code 时遇到了麻烦。 .我没有看到任何 lock block 或 MemoryBarrier 调用。

最佳答案

由于数组已经创建,写入或读取它不会导致任何调整大小。此外,代码本身会阻止读取/写入数组中的相同位置。

最重要的是,代码始终可以计算数组中读取和写入的位置,并且这些调用永远不会相互交叉。因此,它是线程安全的。

关于c# - Parallel.For 中的内存屏障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41653826/

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