[英]Optimizing summation loops
我想在C ++中实现汉高转换。 从向量in
到out
的转换本身(称为dht
和idht
)定义为
out(m) = \sum_{n=0}^N c_{m,n}*in(n)
将c
定义为矩阵。 因此,我通过以下方式(使用armadillo
)实现了它:
void HT::dht(const arma::cx_colvec &in, arma::cx_colvec &out)
{
if(out.size() != in.size())
out = arma::cx_colvec(in.size());
//#pragma omp parallel for
for(size_t i = 0; i < in.size(); ++i)
F(i) = (in[i] * r_max / bessel_zeros[i]);
std::complex<double> G_0;
for(size_t i = 0; i < in.size(); ++i)
{
G_0 = 0;
for(size_t j = 0; j < in.size(); ++j)
G_0 += c(i, j) * F[j];
G(i) = G_0;
};
//#pragma omp parallel for
for(size_t i = 0; i < in.size(); ++i)
out(i) = (G[i] / rho_max *
bessel_zeros[i]);
}
什么是提高此功能速度的最佳方法(根据valgrind,这是我的代码中最耗时的功能)? 我已经使用#pragma
-commands在OpenMP上测试了该功能,但这甚至减慢了速度。 我还能做些什么来提高功能的速度?
目前,该程序使用
g++ -I -O2 -g -march=native -std=gnu++17 -fopenmp main.cpp -lm -larmadillo -lgomp -lpthread -lX11 -L/opt/boost/lib -lboost_system -o main
编辑:我注意到我也可以更简洁地编写代码
F = in % (r_max / bessel_zeros);
G = c * F;
out = G % (bessel_zeros / rho_max);
这使我的加速时间为12.557毫秒vs.500个元素的10.082毫秒,以及359.787毫秒和2500个元素的312.383毫秒。 还有什么我可以优化的吗?
您可以一次计算“ r_max / bessel_zeros”和“ r_max * bessel_zeros”并将它们存储在数组中。
有没有理由只编译优化级别为2(-O2)而不是3的编译器?
休息看起来不错。 我不认为您可以大量播种。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.