Почему clang генерирует rsqrt, если включена защита стека? - PullRequest
0 голосов
/ 18 декабря 2018

Проверьте этот простой код:

#include <cmath>

float foo(float in) {
    return sqrtf(in);
}

При -ffast-math clang генерирует sqrtss, как и ожидалось.Но если я также использую -fstack-protector-all, он изменит sqrtss на rsqrtss, как вы можете видеть на Годболт .Почему?

1 Ответ

0 голосов
/ 18 декабря 2018

Короткая и сладкая:

rsqrtss безопаснее и, как следствие, менее точная и медленная.

sqrtss быстрее и, как следствие, менее безопасно.

Почему rsqrtss безопаснее?

  • Он не использует весь регистр XMM.

Почему rsqrtss медленнее?

  • Поскольку требуется больше регистров для выполнения того же действия, что и sqrtss.

Почему rsqrtss использует обратную величину?

  • В крайнем случае кажется, что обратная величина квадратного корня может быть вычислена быстрее и с меньшим объемом памяти.Пико-спеленда: много математика .

Долгое и горькое:

Исследования

  • Что делает -ffast-math делать?

    -ffast-math
        Enable fast-math mode. This defines the __FAST_MATH__ preprocessor
        macro, and lets the compiler make aggressive, potentially-lossy
        assumptions about floating-point math. These include:
    
        Floating-point math obeys regular algebraic rules for real numbers (e.g. + and * are associative, x/y == x * (1/y), and (a + b) * c == a * c + b * c),
        operands to floating-point operations are not equal to NaN and Inf, and
        +0 and -0 are interchangeable.
    
  • Что делает -fstack-protector-all делать?

    • Этот ответ можно найти здесь .

    • По сути, он «заставляет использовать средства защиты стека для всех функций».

  • Чтоявляется «защитником стека» ?

    • Хорошая статья для вас .

    • Блаженно короткая,довольно ужасно искрящие спаркоты:

      • «Защитник стека» используется для предотвращения перезаписи стека.средство защиты стека, реализованное в gcc и clang, добавляет дополнительную переменную защиты к области стека каждой функции.
    • Интересный недостаток Примечание:

      "Добавление этих проверок приведет к небольшим накладным расходам во время выполнения: требуется больше места в стеке, но это незначительно, за исключением действительно ограниченных систем ... Вы стремитесь к максимальной безопасности за счет производительности?-fstack-protector-all для вас. "

  • Что такое sqrtss?

    Согласно @godbolt:

        Computes the square root of the low single-precision floating-point value
        in the second source operand and stores the single-precision floating-point
        result in the destination operand. The second source operand can be an XMM
        register or a 32-bit memory location. The first source and destination
        operands is an XMM register.
    
  • Что такое «исходный операнд» ?

    • Учебное пособие можно найти здесь

    • По сути, операнд - это местоположение данных в компьютере.Представьте себе простую инструкцию x + x = y. Вам нужно знать, что такое «x», который является исходным операндом.И где будет храниться результат, «у», который является операндом назначения.Обратите внимание, как можно забыть символ «+», который обычно называют «операцией», поскольку в данном примере это не имеет значения.

  • Что такое «регистр XMM» ?

    • Объяснение можно найти здесь .

    • Этопросто определенный тип регистра.Он в основном используется в плавающей математике (что удивительно, это математика, которую вы пытаетесь сделать).

  • Что такое rsqrtss?

    • Опять же, согласно @godbolt:

      Computes an approximate reciprocal of the square root of the low
      single-precision floating-point value in the source operand (second operand)
      stores the single-precision floating-point result in the destination operand.
      The source operand can be an XMM register or a 32-bit memory location. The
      destination operand is an XMM register. The three high-order doublewords of
      the destination operand remain unchanged. See Figure 10-6 in the Intel® 64 and
      IA-32 Architectures Software Developer’s Manual, Volume 1, for an illustration
      of a scalar single-precision floating-point operation.
      
  • Что такое "двойное слово"«?

    • Простое определение .

    • Это единица измерения памяти компьютера, простокак «бит» или «байт».Однако, в отличие от «бит» или «байт», он не универсален и зависит от архитектуры компьютера.

  • Что означает «Рисунок 10-6 в Руководстве разработчика программного обеспечения для архитектуры Intel® 64 и IA-32, том 1 "выглядит так:

    • Здесь вы go .



Отказ от ответственности : Большая часть этого знания основана на внешних источниках.Я буквально установил Clang только сейчас, чтобы помочь ответить на ваш вопрос.Я не эксперт.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...