В качестве дополнения к ответу moyner в , то на чипе sqrt
обычно является rsqrt
, то есть ответная квадратный корень , который вычисляет → 1 / √ . Так что, если в вашем коде вы собираетесь использовать только1/r(если вы занимаетесь молекулярной динамикой, то это так и есть), вы можете вычислитьнапрямую и сэкономить себе деление. Причина, по которойвычисляется вместо,состоит в том, что итерация Ньютона не имеет делений, только сложения и умножения.а → 1 / а--√1 / рr = rsqrt(r2)
rsqrt
sqrt
Как примечание, деления также вычисляются итеративно и почти так же медленно, как rsqrt
в аппаратных средствах. Если вы ищете эффективность, вам лучше убрать лишние разделения.
Некоторые более современные архитектуры, такие как архитектуры IBM POWER , не предоставляют rsqrt
сами по себе, но дают оценку с точностью до нескольких бит, например FRSQRTE . Когда пользователь звонит rsqrt
, это генерирует оценку, а затем одну или две (столько, сколько требуется) итераций алгоритма Ньютона или Голдшмидта с использованием регулярных умножений и сложений. Преимущество этого подхода состоит в том, что этапы итерации могут конвейеризоваться и чередоваться с другими инструкциями без блокирования FPU (очень хороший обзор этой концепции, хотя и на более старых архитектурах, см. В диссертации доктора философии Рольфа Штребеля ).
Что касается потенциалов взаимодействия, sqrt
операции можно полностью избежать, используя полиномиальный интерполятор потенциальной функции, но моя собственная работа (реализованная в mdcore
) в этой области показывает, что, по крайней мере на архитектурах типа x86, sqrt
инструкция достаточно быстрая.
Обновить
Поскольку этот ответ, похоже, привлекает к себе немного внимания, я также хотел бы затронуть вторую часть вашего вопроса, то есть стоит ли пытаться улучшить / устранить основные операции, такие как sqrt
?
В контексте моделирования молекулярной динамики или любого моделирования на основе частиц с взаимодействием, ограниченным срезом, многое можно извлечь из лучших алгоритмов поиска соседей. Если вы используете списки ячеек или что-то подобное, чтобы найти соседей или создать список Verlet , вы будете вычислять большое количество ложных парных расстояний. В наивном случае только 16% проверенных пар частиц будут фактически находиться на расстоянии отсечки друг от друга. Хотя для таких пар взаимодействие не рассчитывается, доступ к данным частиц и вычисление паразитного парного расстояния сопряжены с большими затратами.
Моя собственная работа в этой области ( здесь , здесь и здесь ), а также работа других (например, здесь ), показывают, как можно избежать этих ложных вычислений. Эти алгоритмы поиска соседей даже превосходят списки Verlet, как описано здесь .
Я хочу подчеркнуть, что хотя некоторые улучшения могут быть получены благодаря лучшему знанию / эксплуатации базовой аппаратной архитектуры, потенциально можно добиться большего при переосмыслении алгоритмов более высокого уровня.
rsqrtps
и AVXvrsqrtps
также являются оценочными, они дают правильные первые 11–12 битов, и вам следует уточнить с итерацией Ньютона или двумя, если вы хотите большей точности. Это инструкции 5/1 и 7/1 (задержка / обратная пропускная способность) для Sandy Bridge (см. Документы Intel или таблицы команд Agner Fog, сравнимые с умножением. Для полной точности(v)sqrtps
(или двойной точности(v)sqrtpd
) требуется 10-43 / 10-43 (подробности см. В таблицах инструкций).