优化求和循环
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 的说法,这是我的代码中最耗时的函数)?我已经使用 OpenMP 测试了该功能,使用 #pragma
命令,但这甚至减慢了它的速度。我还能做些什么来提高函数的速度?
目前该程序是使用
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 毫秒的加速比,而 10.082 个元素的 500 毫秒,以及 359.787 毫秒对 312.383 毫秒的 2500 个元素。还有我可以优化的东西吗?
您可以计算一次"r_max/bessel_zeros"和"r_max * bessel_zeros"并将它们存储在数组中。
有没有理由只使用优化级别为 2 (-O2) 而不是 3 的编译器?
休息看起来不错。我不认为你可以把它播种很多。
相关文章:
- 如何循环打印顶点结构
- 如何在C++中从两个单独的for循环中添加两个数组
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 正在尝试了解输入验证循环
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 循环后如何继续阅读
- Ardunio UNO解决了多个重叠的定时器循环
- Eigen如何在容器循环中干净地附加矩阵
- 如何使用循环对所有数字求和?
- 循环中的线程 Runnin 用于对 c++ 中的数字求和
- 如何对 while 循环内的输出求和
- 优化求和循环
- 循环访问 CUDA 中的三维数组以对它们的元素求和
- 如果通过循环求和,下面的程序会找到正确的答案,但如果通过GP的公式求和,则会找到不正确的答案.为什么
- 在C++中使用do-while循环对向量的元素求和
- C++For循环.Int.值的求和不正确
- 多线程c++程序加速一个求和循环
- 如何用循环函数求和
- 在c++中尝试在循环(plink0)中对变量求和
- 使用OpenCL在2D中嵌套循环求和