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

在C++中需要帮助优化循环/点积函数的速度,c++,gcc,euclidean-distance,dot-product,C++,Gcc,Euclidean Distance,Dot Product,我在Tighcloop中识别了一个函数,它在我的程序中占50%的时间用于查找最近的邻居。它计算两个单位向量之间的欧氏距离。有没有办法让这跑得更快?目前我正在使用gcc的-march=native和-ffast数学标志 这段代码是高度并行的,您可以尝试使用一个或一个小线程在不同的线程中进行计算 template<typename T> static inline T distance(const T[] x, const T[] y, int f) { T pp = 0,

我在Tighcloop中识别了一个函数,它在我的程序中占50%的时间用于查找最近的邻居。它计算两个单位向量之间的欧氏距离。有没有办法让这跑得更快?目前我正在使用gcc的-march=native和-ffast数学标志


这段代码是高度并行的,您可以尝试使用一个或一个小线程在不同的线程中进行计算

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是一个并行化库,它依赖于Pragmas来并行化代码,这在科学计算中非常常见。通过在要并行化的语句上指定pragma,可以轻松创建线程

最简单的格式是

#pragma omp parallel for
for(int i = 0; i < 10000; i++) {
    paralelized code here
}

这将负责创建线程,执行并行化代码,并使用简单的pragma定义为您返回线程。

这是用于多个类型还是T实际上只是一个类型?推测T必须是浮点型还是双精度型?x和y可以使用别名吗?f在上面有界吗?调用sqrt的频率/速度有多快?我使用的是gcc的-march=native和-ffast数学标志,以及我假设的-O2或-O3?使用SSE指令如何,类似于这个问题:很高兴简要地解释pragma omp parallel for privatex,z reduction+:pp,适用于不熟悉OpenPagree的@VittorioRomeo。。我也不知道那意味着什么。很高兴知道。编辑以获取更多信息感谢@TomazCanabrava还有一件事,你能解释privatex,z reduce+:pp做什么吗?private表示变量是teach thread的私有变量,reduce表示应该在reduce上使用什么运算符,以及存储计算的变量。
#pragma omp parallel for
for(int i = 0; i < 10000; i++) {
    paralelized code here
}