gpt4 book ai didi

c# - Sum 函数的并行 For 循环性能不佳

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:15:50 24 4
gpt4 key购买 nike

我正在尝试在下图中实现算法:

Image of Algorithm

我的问题是,当我在算法中做 Sum 时,它花费了很多时间。拜托,你能检查一下,我做错了什么吗?

Parallel.For(0, n, i =>
{
Parallel.For(0, n, j =>
{
double sum1 = 0;
double sum2 = 0;
if (i > j)
{
for (int a = 1; a < j - 1; a++)
{
sum1 = sum1 + (matrixL[i, a] * matrixU[a, j]);
}

matrixL[i, j] = (matrixA[i, j] - sum1) / matrixU[j, j];
}
else
{
for (int a = 1; a < i - 1; a++)
{
sum2 = sum2 + (matrixL[i, a] * matrixU[a, j]);
}
matrixU[i, j] = matrixA[i, j] - sum2;
}
});
});

最佳答案

这里有一些项目。

首先,正如@MalteR 在评论中指出的那样,伪代码并未说明外层循环必须是并行的。我读过关于这样做是否真的可以接受的相互矛盾的事情; this blog post Microsoft 表示可以“嵌套”Parallel.For 循环,但我看到其他 Stack Overflow 问题(例如 this one)提示这样做会降低性能。

澄清一下,现在您有:

Parallel.For(0, n, i =>
{
Parallel.For(0, n, j =>
{

而不是

for (int i = 0; i < n; i++)
{
Parallel.For(0, n, j =>
{

请记住,您实际上可以从并行化中获得多少 yield 是有一个硬性限制的。机器一次只能做有限数量的事情(我们称它为 x),所以如果你尝试一次做超过 x 的事情您实际上不会提高性能的任务。

您可以对此进行一些试验,并查看我链接到的文章,看看外部 Parallel.For 循环是有助于还是损害您的性能。

我在这里看到的最大优化是伪代码明确表示您只循环直到收敛,但您总是循环 n 次(即使实际上没有必要)。所以你可以这样做:

for (int i = 0; i < n; i++)
{
Parallel.For(0, n, j =>
{
// Do the algo
}

if ([test for convergence]) {
break; // No need to keep going
}
}

关于c# - Sum 函数的并行 For 循环性能不佳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41169596/

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