Прочитав тему, есть множество свидетельств из многочисленных источников, в которых использование стандартных C или С++-преобразований для преобразования с плавающей запятой на целые числа на Intel очень медленно. Для соответствия спецификации ANSI/ISO процессоры Intel должны выполнять большое количество инструкций, в том числе необходимых для переключения режима округления аппаратного обеспечения FPU.
Существует несколько способов обхода, описанных в различных документах, но самый чистый и самый переносимый, по-видимому, вызов lrint() добавлен в стандарты C99 и С++ 0x. Многие документы говорят, что компилятор должен встроить эти функции в том случае, если оптимизация включена, что приводит к коду, который быстрее обычного приведения в действие или вызову функции.
Я даже нашел ссылки на пакеты отслеживания функций gcc, чтобы добавить это встроенное расширение в gcc-оптимизатор, но в моих собственных тестах производительности мне не удалось заставить его работать. Все мои попытки показывают, что производительность lrint намного медленнее, чем простой стиль C или С++. Изучение сборки сборки компилятора и дизассемблирование скомпилированных объектов всегда показывает явный вызов внешней функции lrint() или lrintf().
В версиях gcc, с которыми я работал, являются 4.4.3 и 4.6.1, и я попытался использовать несколько комбинаций флагов на 32-битных и 64-битных объектах x86, включая опции для явного включения SSE.
Как мне получить gcc для встроенного расширения lrint и дать мне быстрые преобразования?