Посмотрите этот простой код:
#include <cmath>
float foo(float in) {
return sqrtf(in);
}
С -ffast-math
clang, как и ожидалось, генерирует sqrtss
. Но, если я также использую -fstack-protector-all
, он меняет sqrtss
на rsqrtss
, как вы можете видеть на Godbolt. Почему?
Связано с stackoverflow.com/questions/1528727/…?
@TypeIA: это более-менее понятно. Я просто не понимаю, какое отношение имеет стековая защита к sqrt.
@MatthieuBrucher Я думаю, ты прав, я как раз собирался опубликовать эту ссылку сам. Имеет смысл, что -ffast-math -O3
выберет оптимизацию. Думаю, вопрос в том, почему -ffast-math -fstack-protector-all
тоже.
Наверное, одна из эвристик внутри LLVM ...
rsqrtss
является безопаснее и, как следствие, менее точен и медленнее.
sqrtss
является Быстрее и, как следствие, менее безопасен.
Почему rsqrtss
безопаснее?
Почему 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
?
Этот ответ можно найти здесь.
По сути, он «заставляет использовать средства защиты стека для всех функций».
Что такое «протектор стека»?
Хорошая статья для ты.
Блаженно короткие и ужасно убедительные искры:
Интересный недостаток на заметку:
"Добавление этих проверок приведет к небольшим накладным расходам во время выполнения: Больше стека
требуется пространство, но оно незначительно, за исключением действительно ограниченного
систем ... Вы стремитесь к максимальной безопасности за счет
представление? -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», то есть исходный операнд. И где будет сохранен результат, «y», который является операндом назначения. Обратите внимание, как можно забыть символ «+», который обычно называют «операцией», потому что в этом примере он не имеет значения.
Что такое "регистр 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»?
Добро пожаловать в stackoverflow! :) Вы много чего написали, что "около" темы, но на мой вопрос еще нет ответа. И в вашем ответе тоже есть неточности (например, разница между sqrtss
и rsqrtss
).
Он также генерирует
rsqrtss
с-ffast-math -O3
.