gpt4 book ai didi

c - 有限差分法中的性能问题

转载 作者:太空宇宙 更新时间:2023-11-04 06:19:55 25 4
gpt4 key购买 nike

我写了一段 C 代码,使用有限差分法来估计值。这是一种平均法。我分析了代码,发现一个 iterate() 函数是最慢的。

void iterate(double data[][ARRAY_SIZE], int nx, int ny, int dx, int dy)
{
for (int i = 0; i < nx; ++i)
{
for (int j = 0; j < ny; ++j)
{
if (i % (dx + 1) == 0 && j % (dy + 1) == 0)
continue;
else if (i == 0 && 0 < j && j < ny)
data[i][j] = (data[i][j - 1] + data[i][j + 1] + data[i + 1][j]) / 3;
else if (j == 0 && 0 < i && i < nx)
data[i][j] = (data[i - 1][j] + data[i + 1][j] + data[i][j + 1]) / 3;
else if (i == nx - 1 && 0 < j && j < ny)
data[i][j] = (data[i][j - 1] + data[i][j + 1] + data[i - 1][j]) / 3;
else if (j == ny - 1 && 0 < i && i < nx)
data[i][j] = (data[i - 1][j] + data[i + 1][j] + data[i][j - 1]) / 3;
else
data[i][j] = (data[i - 1][j] + data[i + 1][j] + data[i][j - 1] + data[i][j + 1]) / 4;
}
}
}

这个循环运行缓慢,我不确定我在这里遗漏了什么导致它变慢。有没有更好的方法来做同样的事情?

使用 400x400 double 数组进行 2000 次迭代

real    0m1.950s
user 0m1.940s
sys 0m0.004s

最佳答案

这里有一些想法:

  1. 看来 ny 必须等于 ARRAY_SIZE。您也可以将其作为参数省略,而只使用编译时常量。
  2. 除最后一个之外的所有 if/else 子句仅适用于特定的行或列。所以把它们吊出来。例如,您可以将第一行和第一列作为 1D 循环处理,然后在边缘外处理整个矩阵,然后最后处理最右边的列和底行。

最后,您的核心循环应该更像这样:

for (int i = 1; i < nx - 1; ++i)
{
for (int j = 1; j < ARRAY_SIZE - 1; ++j)
{
data[i][j] = (data[i - 1][j] + data[i + 1][j] + data[i][j - 1] + data[i][j + 1]) / 4;
}
}

关于c - 有限差分法中的性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37506579/

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