Мой код сильно зависит от вычисления расстояний между двумя точками в трехмерном пространстве. Чтобы избежать дорогостоящего квадратного корня, я использую квадрат расстояния повсюду. {{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, но не смог найти хороший пример или полный список инструкций (в идеале несколько умножить + сложить два вектора).
Графические процессоры не подходят, поскольку при каждом вызове функции известен только один набор точек.
Какой самый быстрый способ вычислить квадрат расстояния?