Страница 1 из 1
Убыстренный Sqrt
Добавлено: 17.01.2026 12:45:12
Alexander
Результат оптимизаций с помощью ИИ:
Код: Выделить всё
function Sqrt(x: Double): Double; assembler; nostackframe; override;
asm
sqrtsd xmm0, xmm0
end;
На моём компьютере даёт выигрыш порядка 10 процентов по отношению к обычному Sqrt.
Re: Убыстренный Sqrt
Добавлено: 17.01.2026 23:09:07
xchgeaxeax
Вот только в таком виде вам надо будет готовиться к ловле исключений связанных с близкими к 0 числами (ошибка не точного результата) и отрицательными числами (ошибка извлечения квадратного корня). Не говоря уже про банальный NaN.
ИИ конечно много пропылесосил разных примеров, но выданный им результат стоит хотя бы чуть-чуть рассматривать критически.
В обычной функции квадратного корня используется эта же инструкция т.к. SSE2 уже в минимальных требованиях ОС и это можно не проверять. Но вот прирост связан с отсутствием кода проверки диапазона входных значений для инструкции. Достаточно хотя бы проверить число на больше эпсилон квадрат (эпсилон - минимально представимое число в типе double) перед использованием этой инструкции.
Re: Убыстренный Sqrt
Добавлено: 18.01.2026 07:02:33
Alexander
Я ставил задачу перед ИИ на предельное ускорение.
> перед использованием этой инструкции.
А может перед использованием функции? Ведь не во всяком случае есть сомнение в диапазоне, а 10 процентов на проверку теряется всегда. По факту этот ускоритель у меня работает в нескольких проектах и не сбоит.
Re: Убыстренный Sqrt
Добавлено: 18.01.2026 07:40:38
iskander
Alexander писал(а): 17.01.2026 12:45:12
Результат оптимизаций с помощью ИИ:
Код: Выделить всё
function Sqrt(x: Double): Double; assembler; nostackframe; override;
asm
sqrtsd xmm0, xmm0
end;
На моём компьютере даёт выигрыш порядка 10 процентов по отношению к обычному Sqrt.
Любопытно, с какой целью ИА присобачил к функции "override"?
Re: Убыстренный Sqrt
Добавлено: 18.01.2026 08:33:16
Alexander
Любопытно, с какой целью ИА присобачил к функции "override"?
Это правильный вопрос. Сколько не думал и не проверял - не понял. Наверное можно убрать. Видимо он подумал, что раз мы заменяем существующую функцию, то вот вам override (текстуально). Мешать она не мешает, но и смысла в ней нет.
Re: Убыстренный Sqrt
Добавлено: 18.01.2026 15:53:07
iskander
Alexander писал(а): 18.01.2026 08:33:16
Наверное можно убрать. Видимо он подумал, что раз мы заменяем существующую функцию, то вот вам override (текстуально). Мешать она не мешает, но и смысла в ней нет.
Имхо это очень похоже на глюк компилятора.
Re: Убыстренный Sqrt
Добавлено: 19.01.2026 00:53:26
xchgeaxeax
Alexander писал(а): 18.01.2026 07:02:33
А может перед использованием функции?
Тогда стоит добавить ей еще и
inline
Re: Убыстренный Sqrt
Добавлено: 19.01.2026 07:53:52
iskander
xchgeaxeax писал(а): 19.01.2026 00:53:26
Тогда стоит добавить ей еще и
inline
Эффект будет такой же, как и от
override.
Re: Убыстренный Sqrt
Добавлено: 19.01.2026 17:18:09
xchgeaxeax
iskander писал(а): 19.01.2026 07:53:52
Эффект будет такой же, как и от override.
fpc эту функцию может и не заинлайнит, но код на Delphi вполне себе встраивается. Т.е. можно убрать даже лишний вызов и возврат.