gpt4 book ai didi

c++ - 优化求和循环

转载 作者:太空宇宙 更新时间:2023-11-04 12:54:36 24 4
gpt4 key购买 nike

我想用 C++ 实现汉克尔变换。从 vector inout 的转换本身(称为dhtidht)定义为

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 命令通过 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);

对于 500 个元素,我的加速比分别为 12.557 毫秒和 10.082 毫秒,对于 2500 个元素,速度分别为 359.787 毫秒和 312.383 毫秒。还有什么我可以优化的吗?

最佳答案

您可以计算一次 'r_max/bessel_zeros' 和 'r_max * bessel_zeros' 并将它们存储在一个数组中。

您只使用优化级别 2 (-O2) 而不是 3 的编译器是有原因的吗?

休息看起来很好。我不认为你可以播种很多。

关于c++ - 优化求和循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47123699/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com