Страница 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 вполне себе встраивается. Т.е. можно убрать даже лишний вызов и возврат.