Почему clang генерирует rsqrt, если включен stack-protector?

Посмотрите этот простой код:

#include <cmath>

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

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

Он также генерирует rsqrtss с -ffast-math -O3.

TypeIA 17.12.2018 22:11

Связано с stackoverflow.com/questions/1528727/…?

Matthieu Brucher 17.12.2018 22:16

@TypeIA: это более-менее понятно. Я просто не понимаю, какое отношение имеет стековая защита к sqrt.

geza 17.12.2018 22:18

@MatthieuBrucher Я думаю, ты прав, я как раз собирался опубликовать эту ссылку сам. Имеет смысл, что -ffast-math -O3 выберет оптимизацию. Думаю, вопрос в том, почему -ffast-math -fstack-protector-all тоже.

TypeIA 17.12.2018 22:19

Наверное, одна из эвристик внутри LLVM ...

Matthieu Brucher 17.12.2018 22:19
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
5
260
1

Ответы 1

Коротко и мило:

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», то есть исходный операнд. И где будет сохранен результат, «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»?



Отказ от ответственности: Most of this knowlegde comes from outside sources. I literally install clang just now to help answer your question. I'm not an expert.

Добро пожаловать в stackoverflow! :) Вы много чего написали, что "около" темы, но на мой вопрос еще нет ответа. И в вашем ответе тоже есть неточности (например, разница между sqrtss и rsqrtss).

geza 18.12.2018 03:08

Другие вопросы по теме

Похожие вопросы