Сообщение 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
На самом деле там затратной операцией, как ни странно это может показаться, является преобразование из int в float. При её вынесении во внешний цикл код начинает работать быстрее примерно на 10% по сравнению с вариантом, использующим фэйковую строчку.
Однако, если хочется ещё большей комичности происходящего, можно попробовать в f1 заменить
на
У меня это приводит к увеличению времени выполнения f1 примерно на 20%.
_>>Ну да, это именно то что и ожидалось от оптимизатора — вынести вычисления не зависимые от параметров вложенного цикла на верхний уровень, с чем gcc/icc справились, clang нет (хоть и сделал частичную раскрутку вложенного цикла), vcc(cl) — условно
_>Там кстати не так всё просто. Потому как эффект наблюдается и на таком http://rsdn.org/forum/cpp/6723478.1
Автор: alex_public
Дата: 12.03.17
упрощённом коде, в котором нечего "выносить на другой уровень". )))Дата: 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
На самом деле там несколько лишней операцией является преобразование из int в float (причём она, видимо, оказывается затратной не столько с точки зрения времени её выполнения, сколько просто по факту её присутствия, от которого оптимизатор приходит в ступор и выбирает другой способ генерации кода). При её вынесении во внешний цикл код начинает работать быстрее примерно на 10% по сравнению с вариантом, использующим фэйковую строчку.
Однако, если хочется ещё большей комичности происходящего, можно попробовать в f1 заменить
на
У меня это приводит к увеличению времени выполнения f1 примерно на 20%.
_>>Ну да, это именно то что и ожидалось от оптимизатора — вынести вычисления не зависимые от параметров вложенного цикла на верхний уровень, с чем gcc/icc справились, clang нет (хоть и сделал частичную раскрутку вложенного цикла), vcc(cl) — условно
_>Там кстати не так всё просто. Потому как эффект наблюдается и на таком http://rsdn.org/forum/cpp/6723478.1
Автор: alex_public
Дата: 12.03.17
упрощённом коде, в котором нечего "выносить на другой уровень". )))Дата: 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%.