Информация об изменениях

Сообщение Re[5]: Примечание к тестам производительности от 12.03.2017 19:31

Изменено 12.03.2017 20:22 N. I.

Re[5]: Примечание к тестам производительности
alex_public:

_>>Ну да, это именно то что и ожидалось от оптимизатора — вынести вычисления не зависимые от параметров вложенного цикла на верхний уровень, с чем gcc/icc справились, clang нет (хоть и сделал частичную раскрутку вложенного цикла), vcc(cl) — условно


_>Там кстати не так всё просто. Потому как эффект наблюдается и на таком http://rsdn.org/forum/cpp/6723478.1
Автор: alex_public
Дата: 12.03.17
упрощённом коде, в котором нечего "выносить на другой уровень". )))


На самом деле там затратной операцией, как ни странно это может показаться, является преобразование из int в float. При её вынесении во внешний цикл код начинает работать быстрее примерно на 10% по сравнению с вариантом, использующим фэйковую строчку.

void f1()
{
    for (int i = 2; i < N_MULTIPLY; i++)
    {
        float const multiplier = static_cast<float>(i);
        for (int j = 0; j < N_GENERATED; j++)
            outputs[j] = inputs[j] * multiplier;
    }
}

Однако, если хочется ещё большей комичности происходящего, можно попробовать в f1 заменить

outputs[j] = inputs[j] * i;

на

outputs[j] = i;

У меня это приводит к увеличению времени выполнения f1 примерно на 20%.
Re[5]: Примечание к тестам производительности
alex_public:

_>>Ну да, это именно то что и ожидалось от оптимизатора — вынести вычисления не зависимые от параметров вложенного цикла на верхний уровень, с чем gcc/icc справились, clang нет (хоть и сделал частичную раскрутку вложенного цикла), vcc(cl) — условно


_>Там кстати не так всё просто. Потому как эффект наблюдается и на таком http://rsdn.org/forum/cpp/6723478.1
Автор: alex_public
Дата: 12.03.17
упрощённом коде, в котором нечего "выносить на другой уровень". )))


На самом деле там несколько лишней операцией является преобразование из int в float (причём она, видимо, оказывается затратной не столько с точки зрения времени её выполнения, сколько просто по факту её присутствия, от которого оптимизатор приходит в ступор и выбирает другой способ генерации кода). При её вынесении во внешний цикл код начинает работать быстрее примерно на 10% по сравнению с вариантом, использующим фэйковую строчку.

void f1()
{
    for (int i = 2; i < N_MULTIPLY; i++)
    {
        float const multiplier = static_cast<float>(i);
        for (int j = 0; j < N_GENERATED; j++)
            outputs[j] = inputs[j] * multiplier;
    }
}

Однако, если хочется ещё большей комичности происходящего, можно попробовать в f1 заменить

outputs[j] = inputs[j] * i;

на

outputs[j] = i;

У меня это приводит к увеличению времени выполнения f1 примерно на 20%.