Короткая и сладкая:
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 "выглядит так:
Отказ от ответственности : Большая часть этого знания основана на внешних источниках.Я буквально установил Clang только сейчас, чтобы помочь ответить на ваш вопрос.Я не эксперт.