Прочитав тему, есть множество свидетельств из многочисленных источников, в которых использование стандартных C или C++-преобразований для конвертации с плавающей точкой в целые числа на Intel очень медленно. Чтобы соответствовать спецификации ANSI/ISO, процессорам Intel необходимо выполнить большое количество инструкций, в том числе необходимых для переключения режима округления аппаратного обеспечения FPU.Как обеспечить, чтобы lrint был встроен в gcc?
Существует ряд обходных решений, описанных в различных документах, но самый чистый и самый портативный, по-видимому, является вызовом lrint(), добавленным в стандарты C99 и C++ 0x. Во многих документах говорится, что компилятор должен встроить эти функции в том случае, если оптимизация включена, что приводит к коду, который быстрее обычного, или вызову функции.
Я даже нашел ссылки на пакеты отслеживания функций gcc, чтобы добавить это встроенное расширение в gcc-оптимизатор, но в моих собственных тестах производительности мне не удалось заставить его работать. Все мои попытки показывают, что производительность lrint намного медленнее, чем простой стиль C или C++. Изучение сборки сборки компилятора и дизассемблирование скомпилированных объектов всегда показывает явный вызов внешней функции lrint() или lrintf().
Режимы gcc, с которыми я работал, - это 4.4.3 и 4.6.1, и я попытался выполнить ряд комбинаций флагов на 32-битных и 64-битных объектах x86, включая опции для явного включения SSE.
Как получить gcc для встроенного расширения lrint и дать мне быстрые преобразования?
Вы действительно профилировали и подтвердили, что с использованием очевидного приведения значительная часть времени выполнения вашей программы? –
Профилирование показывает, что я могу получить разницу в скорости 2-4%, используя ручной макет ассемблера, снятый с статьи. Это стоит того, что вычисление выполняется между кадрами приложения 3D-рендеринга. –
Вы установили '-fno-math-errno'? вы также должны рассмотреть возможность использования '-ffast-math', что не всегда является опцией, если вы полагаетесь на определенную fp-семантику ... – Christoph