需要帮助优化C ++中循环/点积函数的速度

时间:2017-03-29 15:07:42

标签: c++ gcc euclidean-distance dot-product

我已经确定了一个紧凑循环中的功能,它在我的程序中占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;
  }

1 个答案:

答案 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定义为您重新连接线程。

相关问题