Что является более эффективным, atan2 или sqrt? - PullRequest
5 голосов
/ 16 февраля 2012

В некоторых ситуациях существует несколько методов для вычисления одного и того же значения.

Прямо сейчас я придумываю алгоритм для "расширения" 2D выпуклого многоугольника. Для этого я хочу найти направление, в котором нужно возмущать каждую вершину. Чтобы получить результат, который расширяет многоугольник с «оболочкой» одинаковой толщины вокруг, величина возмущения в этом направлении также зависит от угла в вершине. Но сейчас я просто беспокоюсь о направлении.

Один из способов - использовать atan2: пусть B - моя вершина, A - предыдущая вершина, а C - следующая вершина. Мое направление - «среднее угловое» из angle(B-A) и angle(B-C).

Другой способ включает sqrt: unit(B-A)+unit(B-C), где unit(X) равно X/length(X), дает вектор с моим направлением.

Я склоняюсь к методу № 2, потому что усреднение значений углов требует немного работы. Но я в основном выбираю между двумя вызовами atan2 и двумя вызовами sqrt. Что вообще быстрее? Что если я делаю это в шейдерной программе?

Я не пытаюсь оптимизировать свою программу как таковую, я хотел бы знать, как эти функции обычно реализуются (например, в стандартных библиотеках c), поэтому я смогу узнать, в общем, что такое лучший выбор.

Из того, что я знаю, функции sqrt и trig требуют итеративного метода для получения ответа. Это причина, почему мы стараемся избегать их, когда это возможно. Люди придумали «приблизительные» функции, которые используют таблицы поиска и интерполяцию и тому подобное, чтобы попытаться получить более быстрые результаты. Я, конечно, никогда не буду беспокоиться об этом, если не найду убедительных доказательств узкого места в моем коде только из-за этих подпрограмм или подпрограмм, интенсивно связанных с ними, но различия между sqrt, триггерными и обратными триггерными функциями могут иметь значение для обсуждения ,

Ответы [ 3 ]

21 голосов
/ 16 февраля 2012

С типичными библиотеками на обычном современном оборудовании sqrt быстрее, чем atan2.Могут существовать случаи, когда atan2 быстрее, но они немногочисленны.

Последние реализации x86 на самом деле имеют довольно эффективную инструкцию sqrt, и на этом оборудовании разница может быть весьма существенной.В Руководстве по оптимизации Intel цитируется квадратный корень с одинарной точностью, равный 14 циклам на Sandybridge, и квадратный корень с двойной точностью, равный 22 циклам.С хорошей математической библиотекой atan2 время обычно составляет около 100 или более циклов.

1 голос
/ 16 февраля 2012

Похоже, у вас есть вся информация, которую вам нужно профилировать и выяснить для себя.

Если вы не ищете точного результата и не возражаете против дополнительной логики, необходимой для его работы, вы можете использовать специализированные операции, такие как RSQRTSS, RSQRTPS, которые вычисляют 1/sqrt, для объединить две дорогостоящие операции.

0 голосов
/ 17 февраля 2012

Действительно, sqrt лучше, чем atan2, а 1 / sqrt лучше, чем sqrt.

Для не встроенного решения вас могут заинтересовать CORDIC приближения .

Но в вашем случае вы должны разработать полные формулы и оптимизировать их глобально, прежде чем делать какие-либо выводы, потому что трансцендентные функции являются лишь частью вычислений.

...