Как я могу убедиться, что lrint встроен в gcc?

После ознакомления с предметом, из многочисленных источников можно найти неопровержимые свидетельства того, что использование стандартных 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 и обеспечить быстрое преобразование?

12
задан Coren 23 February 2012 в 18:11
поделиться