Почему скаляр SSE sqrt (x) медленнее, чем rsqrt (x) * x?

Я использовал бы цикл, который похож на это

for(DateTime date = begin; date <= end; date = date.AddDays(1))
{
}

, Набор начинается и заканчивается соответственно

105
задан It'sNotALie. 25 April 2018 в 10:45
поделиться

2 ответа

sqrtss дает правильно округленный результат. rsqrtss дает приближение к обратному с точностью примерно до 11.

sqrtss генерирует гораздо более точный результат, когда требуется точность. rsqrtss существует для случаев, когда достаточно приближения, но требуется скорость. Если вы прочитаете документацию Intel, вы также найдете последовательность инструкций (аппроксимация обратного квадратного корня, за которой следует один шаг Ньютона-Рафсона), которая дает почти полную точность (~ 23 бита точности, если я правильно помню), и все же несколько быстрее, чем sqrtss .

edit: Если скорость критична, и вы действительно вызываете это в цикле для многих значений, вам следует использовать векторизованные версии этих инструкций,

210
ответ дан 24 November 2019 в 03:58
поделиться

Вместо того, чтобы давать ответ, он на самом деле может быть неверным (я также не собираюсь проверять или спорить о кеше и других вещах, скажем, они идентичны), я попытаюсь указать обращайтесь к источнику, который может ответить на ваш вопрос.
Разница может заключаться в том, как вычисляются sqrt и rsqrt. Вы можете прочитать больше здесь http://www.intel.com/products/processor/manuals/ . Я предлагаю начать с чтения о функциях процессора, которые вы используете, есть некоторая информация, особенно о rsqrt (процессор использует внутреннюю таблицу поиска с огромным приближением, что значительно упрощает получение результата). Может показаться, что rsqrt настолько быстрее, чем sqrt, что 1 дополнительная операция mul (что не слишком дорого) может не изменить ситуацию.

Edit: Несколько фактов, которые стоит упомянуть:
1. Однажды я делал некоторые микрооптимизации для своей графической библиотеки и использовал rsqrt для вычисления длины векторов. (вместо sqrt я умножил свою сумму квадратов на rsqrt, что и было сделано в ваших тестах), и результат стал лучше.
2. Вычисление rsqrt с использованием простой таблицы поиска может быть проще, как и для rsqrt, когда x переходит в бесконечность, 1 / sqrt (x) переходит в 0, поэтому для малых x значения функции не меняются (сильно), тогда как для sqrt - он уходит в бесконечность, так что это тот простой случай;).

Кроме того, пояснение: я не уверен, где я нашел это в книгах, на которые я ссылался, но я почти уверен, что читал, что rsqrt использует некоторую таблицу поиска, и ее следует использовать только, когда результат не обязательно должен быть точным, хотя - я тоже могу ошибаться, как это было некоторое время назад :).

5
ответ дан 24 November 2019 в 03:58
поделиться
Другие вопросы по тегам:

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