【发布时间】:2016-09-27 03:46:01
【问题描述】:
我写了一段 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
【问题讨论】:
-
您能否给我们一组典型的输入以及运行它需要多长时间?
-
你用
-O3编译吗? -
是的,我用
Ofast和O3编译 -
您可能希望至少处理内部循环之外的一些边缘情况。
标签: c performance loops multidimensional-array