Убыстренный Sqrt

Проектирование и разработка идеального средства программирования.

Модератор: Модераторы

Ответить
Аватара пользователя
Alexander
энтузиаст
Сообщения: 875
Зарегистрирован: 18.12.2005 18:10:00
Откуда: оттуда
Контактная информация:

Убыстренный Sqrt

Сообщение Alexander »

Результат оптимизаций с помощью ИИ:

Код: Выделить всё

function Sqrt(x: Double): Double; assembler; nostackframe; override;
asm
  sqrtsd xmm0, xmm0
end;
На моём компьютере даёт выигрыш порядка 10 процентов по отношению к обычному Sqrt.
xchgeaxeax
постоялец
Сообщения: 207
Зарегистрирован: 11.05.2023 02:51:40

Сообщение xchgeaxeax »

Вот только в таком виде вам надо будет готовиться к ловле исключений связанных с близкими к 0 числами (ошибка не точного результата) и отрицательными числами (ошибка извлечения квадратного корня). Не говоря уже про банальный NaN.

ИИ конечно много пропылесосил разных примеров, но выданный им результат стоит хотя бы чуть-чуть рассматривать критически.
В обычной функции квадратного корня используется эта же инструкция т.к. SSE2 уже в минимальных требованиях ОС и это можно не проверять. Но вот прирост связан с отсутствием кода проверки диапазона входных значений для инструкции. Достаточно хотя бы проверить число на больше эпсилон квадрат (эпсилон - минимально представимое число в типе double) перед использованием этой инструкции.
Аватара пользователя
Alexander
энтузиаст
Сообщения: 875
Зарегистрирован: 18.12.2005 18:10:00
Откуда: оттуда
Контактная информация:

Сообщение Alexander »

Я ставил задачу перед ИИ на предельное ускорение.

> перед использованием этой инструкции.

А может перед использованием функции? Ведь не во всяком случае есть сомнение в диапазоне, а 10 процентов на проверку теряется всегда. По факту этот ускоритель у меня работает в нескольких проектах и не сбоит.
iskander
энтузиаст
Сообщения: 630
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

Alexander писал(а): 17.01.2026 12:45:12 Результат оптимизаций с помощью ИИ:

Код: Выделить всё

function Sqrt(x: Double): Double; assembler; nostackframe; override;
asm
  sqrtsd xmm0, xmm0
end;
На моём компьютере даёт выигрыш порядка 10 процентов по отношению к обычному Sqrt.
Любопытно, с какой целью ИА присобачил к функции "override"?
Аватара пользователя
Alexander
энтузиаст
Сообщения: 875
Зарегистрирован: 18.12.2005 18:10:00
Откуда: оттуда
Контактная информация:

Сообщение Alexander »

Любопытно, с какой целью ИА присобачил к функции "override"?
Это правильный вопрос. Сколько не думал и не проверял - не понял. Наверное можно убрать. Видимо он подумал, что раз мы заменяем существующую функцию, то вот вам override (текстуально). Мешать она не мешает, но и смысла в ней нет.
iskander
энтузиаст
Сообщения: 630
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

Alexander писал(а): 18.01.2026 08:33:16 Наверное можно убрать. Видимо он подумал, что раз мы заменяем существующую функцию, то вот вам override (текстуально). Мешать она не мешает, но и смысла в ней нет.
Имхо это очень похоже на глюк компилятора.
xchgeaxeax
постоялец
Сообщения: 207
Зарегистрирован: 11.05.2023 02:51:40

Сообщение xchgeaxeax »

Alexander писал(а): 18.01.2026 07:02:33 А может перед использованием функции?
Тогда стоит добавить ей еще и inline
iskander
энтузиаст
Сообщения: 630
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

xchgeaxeax писал(а): 19.01.2026 00:53:26 Тогда стоит добавить ей еще и inline
Эффект будет такой же, как и от override.
xchgeaxeax
постоялец
Сообщения: 207
Зарегистрирован: 11.05.2023 02:51:40

Сообщение xchgeaxeax »

iskander писал(а): 19.01.2026 07:53:52 Эффект будет такой же, как и от override.
fpc эту функцию может и не заинлайнит, но код на Delphi вполне себе встраивается. Т.е. можно убрать даже лишний вызов и возврат.
Ответить