我已经确定了一个紧凑循环中的功能,它在我的程序中占50%的时间(找到最近的邻居)。它计算两个单位矢量之间的欧氏距离。有没有办法让这个跑得更快? (目前我使用的是gcc' s -march=native
和-ffast-math
标志)
template<typename T>
static inline T distance(const T* x, const T* y, int f) {
T pp = 0, qq = 0, pq = 0;
for (int z = 0; z < f; z++, x++, y++) {
pp += (*x) * (*x);
qq += (*y) * (*y);
pq += (*x) * (*y);
}
T ppqq = pp * qq;
if (ppqq > 0) return 2.0 - 2.0 * pq / sqrt(ppqq);
else return 2.0;
}
答案 0 :(得分:1)
此代码具有高度可兼容性,您可以尝试使用OpenMP或小线程在不同的线程中进行计算。
template<typename T>
static inline T distance(const T[] x, const T[] y, int f) {
T pp = 0, qq = 0, pq = 0;
#pragma omp parallel for private(x,z) reduction(*:pp)
for (int z = 0; z < f; z++, x++) {
pp += (*x) * (*x);
}
}
OpenMP是一个Paralelization库,依赖于Pragma来实现代码的并行化,它在科学计算中非常普遍。您可以通过在您想要并行化的语句中指定编译指示来轻松创建线程。
最简单的格式是
#pragma omp parallel for
for(int i = 0; i < 10000; i++) {
paralelized code here
}
这将负责创建线程,执行paralelized代码并使用简单的#pragma定义为您重新连接线程。