Я написал фрагмент кода 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;
}
}
}
Этот цикл работает медленно, и я не уверен, что здесь отсутствует, что замедляет работу. Есть ли лучший способ сделать то же самое?
2000 итераций с массивом 400x400
double
занимает
real 0m1.950s
user 0m1.940s
sys 0m0.004s
Можете ли вы дать нам типичный набор входных данных и сколько времени потребуется для запуска? –
Вы компилируете с '-O3'? –
Да, я скомпилирован с 'Ofast', а также' O3' –