Как работает sqrt () GCC после компиляции?Какой метод root используется?Ньютон-Рафсона? - PullRequest
0 голосов
/ 12 февраля 2019

Просто любопытство по поводу стандарта sqrt() из math.h на GCC работает.Я кодировал свой sqrt(), используя Ньютона-Рафсона, чтобы сделать это!

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

да, я знаю fsqrt.Но как процессор это делает?Я не могу отладить аппаратное обеспечение

Типичное аппаратное обеспечение div / sqrt в современных процессорах использует мощность 2 радиуса для вычисления нескольких результирующих битов одновременно.Например, http://www.imm.dtu.dk/~alna/pubs/ARITH20.pdf представляет детали проекта для ALU Radix-16 div / sqrt и сравнивает его с проектом в Penryn.(Они требуют меньшего времени ожидания и меньшей мощности.) Я посмотрел на фотографии;Похоже, основная идея состоит в том, чтобы что-то сделать и передать результат через множитель и суммировать итеративно, в основном, как длинное деление.И я думаю, что это похоже на то, как вы делали бы программное обеспечение по частям.

Intel Broadwell представила модуль Radix-1024 div / sqrt. Это обсуждение RWT спрашивает об изменениях между Penryn (Radix-16) и Broadwell.например, расширение векторного делителя SIMD, чтобы 256-битное деление было менее медленным по сравнению со 128-битным, а также увеличение радиуса.

Возможно также см.


Но, несмотря на то, что аппаратное обеспечение работает, IEEE требует sqrt (и mul / div / add / sub) для правильного округления результат , то есть ошибка <= 0,5 ulp, поэтому <strong>вам не нужно знать, как это работает, только производительность .Эти операции являются специальными, другие функции, такие как log и sin do , а не , имеют это требование, и реальные реализации библиотеки обычно не так точны.(И x87 fsin определенно не настолько точен для входов около Pi / 2, где катастрофическое подавление в уменьшении диапазона приводит к потенциально огромным относительным ошибкам.)

См. https://agner.org/optimize/ для таблиц инструкций x86, включая пропускную способность и задержку для скалярных и SIMD sqrtsd / sqrtss и их более широких версий.Я собрал результаты в деление с плавающей запятой по сравнению с умножением с плавающей запятой

Для не-x86 аппаратного sqrt вам нужно будет посмотреть на данные, опубликованные другими поставщиками, или результаты от людей, которыепротестировали его.

В отличие от большинства инструкций, производительность sqrt обычно зависит от данных.(Обычно более значимые биты или большая величина результата занимают больше времени.)

0 голосов
/ 12 февраля 2019

sqrt определяется C, поэтому, скорее всего, вам придется искать в glibc.

Вы не указали, какую архитектуру вы запрашиваете, поэтому я думаю, что можно предположить x86-64,В этом случае они определены в:

tl; dr они просто реализуются путем вызова инструкций квадратного корня x86-64 sqrts{sd}:

Кроме тогои просто ради обсуждения, если вы включите fast-math (то, что вам, вероятно, следует не делать, если вы заботитесь о точности результата), вы увидите, что большинство компиляторов фактически встроивают вызов и напрямую генерируютsqrts{sd} инструкции:

https://godbolt.org/z/Wb4unC

...