Я тестировал некоторые важные подпрограммы, выполняя циклы, такие как:
float *src, *dst;
for (int i=0; i<cnt; i++) dst[i] = round(src[i]);
Все с целью AVX2, новейшим CLANG.Интересно, что floor (x), ceil (x), int (x) ... все кажется быстрым.Но round (x) кажется чрезвычайно медленным и, глядя на разборку, вместо более новых версий SSE или AVX есть какой-то странный код спагетти.Даже когда блокируется возможность векторизации циклов путем введения некоторой зависимости, раунд примерно в 10 раз медленнее.Для пола и т. Д. Сгенерированный код использует vroundss, для раунда - код спагетти ... Есть идеи?
Редактировать: я использую -ffast-math, -mfpmath = sse, -fno-math-errno, -O3, -std = c ++ 17, -march = core-avx2 -mavx2 -mfma