Самый быстрый способ вычисления квадрата расстояния

Мой код сильно зависит от вычисления расстояний между двумя точками в трехмерном пространстве. Чтобы избежать дорогостоящего квадратного корня, я использую квадрат расстояния повсюду. {{1 }} Но все же это занимает большую часть вычислительного времени, и я хотел бы заменить мою простую функцию чем-то еще более быстрым. Теперь у меня есть:

double distance_squared(double *a, double *b)
{
  double dx = a[0] - b[0];
  double dy = a[1] - b[1];
  double dz = a[2] - b[2];

  return dx*dx + dy*dy + dz*dz;
}

Я также пробовал использовать макрос, чтобы избежать этой функции. звоните, но это мало помогает.

#define DISTANCE_SQUARED(a, b) ((a)[0]-(b)[0])*((a)[0]-(b)[0]) + ((a)[1]-(b)[1])*((a)[1]-(b)[1]) + ((a)[2]-(b)[2])*((a)[2]-(b)[2])

Я думал об использовании инструкций SIMD, но не смог найти хороший пример или полный список инструкций (в идеале несколько умножить + сложить два вектора).

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

Какой самый быстрый способ вычислить квадрат расстояния?

14
задан Pim Schellart 10 November 2011 в 10:19
поделиться