Почему скорость этого решателя SOR зависит от входа?

Связанный с моимдругой вопросТеперь я изменил решатель разреженных матриц, чтобы использовать метод SOR (Successive Over-Relaxation). Код теперь выглядит следующим образом:

void SORSolver::step() {
    float const omega = 1.0f;
    float const
        *b = &d_b(1, 1),
        *w = &d_w(1, 1), *e = &d_e(1, 1), *s = &d_s(1, 1), *n = &d_n(1, 1),
        *xw = &d_x(0, 1), *xe = &d_x(2, 1), *xs = &d_x(1, 0), *xn = &d_x(1, 2);
    float *xc = &d_x(1, 1);
    for (size_t y = 1; y < d_ny - 1; ++y) {
        for (size_t x = 1; x < d_nx - 1; ++x) {
            float diff = *b
                - *xc
                - *e * *xe
                - *s * *xs - *n * *xn
                - *w * *xw;
            *xc += omega * diff;
            ++b;
            ++w; ++e; ++s; ++n;
            ++xw; ++xe; ++xs; ++xn;
            ++xc;
        }
        b += 2;
        w += 2; e += 2; s += 2; n += 2;
        xw += 2; xe += 2; xs += 2; xn += 2;
        xc += 2;
    }
}

Теперь странная вещь: если я увеличуomega (фактор релаксации), скорость выполнения начинает зависетьдраматично на значения внутри различных массивов!

Заomega = 1.0fвремя выполнения более или менее постоянно. Заomega = 1.8, первый раз, как правило, это займет, скажем, 5 миллисекунд, чтобы выполнить этоstep() В 10 раз, но постепенно будет увеличиваться до 100 мс во время симуляции. Если я установлюomega = 1.0001fЯ вижу соответственно небольшое увеличение времени выполнения; вышеomega идет, быстрее время выполнения будет увеличиваться во время моделирования.

Поскольку все это встроено в решатель флюидов, трудно привести отдельный пример. Но я сохранил исходное состояние и перезапускаю решатель для этого состояния каждый шаг по времени, а также решаю для фактического шага по времени. Для начального состояния это было быстро, для последующих временных шагов пошагово медленнее. Поскольку все остальное одинаково, это доказывает, что скорость выполнения этого кода зависит от значений в этих шести массивах.

Это воспроизводимо на Ubuntu с g ++, а также на 64-битной Windows 7 при компиляции для 32-битной с VS2008.

Я слышал, что значения NaN и Inf могут быть медленнее для вычислений с плавающей запятой, но нет ни NaN, ни Infs. Возможно ли, что скорость вычислений с плавающей запятой в противном случае зависит от значений входных чисел?

Ответы на вопрос(2)

Ваш ответ на вопрос