Як доповнення до відповіді Майнера , на мікросхемі sqrt
зазвичай є rsqrt
, тобто зворотний квадратний корінь, який обчислює . Отже, якщо у вашому коді ви будете використовувати лише1/r(якщо ви працюєте з молекулярною динамікою, ви є), ви можете обчислитибезпосередньо та зберегти собі поділ. Причиною, що розраховується замість,є те, що її ітерація Ньютона не має поділів, а лише додавання та множення.a → 1 / a--√1 / рr = rsqrt(r2)
rsqrt
sqrt
Як бічне зауваження, підрозділи також обчислюються повторно і майже так само повільно, як і rsqrt
в апараті. Якщо ви шукаєте ефективність, вам краще спробувати усунути зайві поділи.
Деякі більш сучасні архітектури, такі як архітектури POWER IBM, не мають rsqrt
per-se, але оцінку з точністю до кількох біт, наприклад FRSQRTE . Коли користувач дзвонить rsqrt
, це генерує оцінку, а потім одну чи дві (стільки, скільки потрібно) ітерацій алгоритму Ньютона чи Гольдшмідта, використовуючи регулярні множення та додавання. Перевага такого підходу полягає в тому, що етапи ітерації можуть бути конвеєрними та переплетеними з іншими інструкціями, не блокуючи ФПУ (про дуже хороший огляд цієї концепції, хоч і щодо старих архітектур, див . Кандидатську дисертацію Рольфа Стребеля ).
Щодо потенціалів взаємодії, sqrt
операції можна повністю уникнути, використовуючи поліноміальний інтерполянт функції потенціалу, але моя власна робота (реалізована mdcore
в цій галузі) показує, що, принаймні, в архітектурах типу x86, sqrt
інструкція досить швидка.
Оновлення
Оскільки ця відповідь, як видається, привертає трохи уваги, я також хотів би звернутися до другої частини вашого питання, тобто чи дійсно варто спробувати покращити / усунути базові операції, такі як sqrt
?
У контексті моделювання молекулярної динаміки або будь-якого моделювання на основі частинок із обмеженою взаємодією взаємодії можна багато чого отримати від кращих алгоритмів пошуку сусідів. Якщо ви використовуєте списки комірок або щось подібне, щоб знайти сусідів або створити список Verlet , ви будете обчислювати велику кількість помилкових парних відстаней. У наївному випадку лише 16% пар перевірених частинок фактично опиняться в межах відстані один від одного. Хоча взаємодія для таких пар не обчислюється, доступ до даних про частинки та обчислення хибної попарної відстані несе великі витрати.
Моя власна робота в цій галузі ( тут , тут і тут ), а також робота інших (наприклад, тут ) показують, як можна уникнути цих помилкових обчислень. Ці алгоритми пошуку сусідів навіть виконують списки Verlet, як описано тут .
Я хочу наголосити на тому, що, хоча можна отримати деякі вдосконалення від кращого знання / експлуатації базової апаратної архітектури, можливі також більші вигоди від переосмислення алгоритмів вищого рівня.
rsqrtps
і AVX -vrsqrtps
це також оцінки, вони отримують перші 11 - 12 біт правильними, і вам слід уточнити ітерацію Ньютона або дві, якщо ви хочете отримати більшу точність. Це інструкції 5/1 та 7/1 (затримка / зворотна пропускна здатність) щодо Sandy Bridge (див. Таблиці інструкцій Intel або Agner Fog, що можна порівняти з множенням. На противагу цьому повна точність(v)sqrtps
(або подвійна точність(v)sqrtpd
) займає 10-43 / 10-43 (детальніше див. Таблиці інструкцій).