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