gpt4 book ai didi

c# - 并行 C#

转载 作者:行者123 更新时间:2023-11-30 20:16:37 27 4
gpt4 key购买 nike

我正在尝试提高计算图像平均值的方法的性能。

为此,我使用了两个 For 语句来迭代所有图像,因此我尝试使用一个 Parallel For 来改进它,但结果并不相同。

我做错了吗?或者是什么导致了差异?

public static double MeanDN(this GrayImage image)
{
double mean = 0;
int totalPixels = image.Width * image.Height;

for (int i = 0; i < image.Height; i++)
for (int j = 0; j < image.Width; j++)
mean += (double)image[i, j] / totalPixels;

double parallelMean = 0;

Parallel.For(0, image.Height, i =>
{
for (int j = 0; j < image.Width; j++)
parallelMean += (double)image[i, j] / totalPixels;
});

return mean;
}

输出:

mean = 404.12

parallelMean = 148.8658

最佳答案

您正在访问一个资源(变量 parallelMean),但没有来自多个线程的同步。有些更改会相互覆盖,有些读取会读取错误或旧数据。这就是您看到错误结果的原因。

最简单的解决方案是在对该变量的写访问周围放置一个 lock 语句,但这会强制它返回顺序执行。

如果您需要对结果进行计算,使用 PLinq 可能会更容易,它会为您完成大部分同步工作:

var mean = Enumerable.Range(0, image.Height)
.AsParallel()
.Select(i => Enumerable.Range(0, image.Width)
.AsParallel()
.Sum(j => (double)image[i, j] / totalPixels))
.Sum();

关于c# - 并行 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48442154/

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