在C++中需要帮助优化循环/点积函数的速度
我在Tighcloop中识别了一个函数,它在我的程序中占50%的时间用于查找最近的邻居。它计算两个单位向量之间的欧氏距离。有没有办法让这跑得更快?目前我正在使用gcc的-march=native和-ffast数学标志在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,
这段代码是高度并行的,您可以尝试使用一个或一个小线程在不同的线程中进行计算
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
}