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