gpt4 book ai didi

c++ - 如何优化数值求解器中的大量复制和访问操作?

转载 作者:行者123 更新时间:2023-11-30 02:49:08 27 4
gpt4 key购买 nike

我正在编写一小段代码,它将密度从一个时间步迭代地传输到另一个时间步,直到到达目的地时间

我正在处理的代码具有以下形式:

  1. 初始化
  2. 现在和下一个缓冲区之间的乒乓球

    1. 计算下一个新的细化级别
    2. 对于现在 vector 的每个值,一些数量会添加到下一个。

我的问题:是否有一个通用的模式来加速这样一段代码?

附带问题:我可以使用 STL 算法以更好/更好的方式实现它吗?


std::vector<double> ping;
std::vector<double> pong;
ping.reserve(1000000);
pong.reserve(1000000);


std::vector* now= &ping;
std::vector* next = &pong;

Initialize(now); // Fill first timestep
for(size_t t = 0; t < 1000; t++) // timesteps
{
size_t M = now->size();
size_t N = calcNewRefinement(t, now);
next->resize(N);
for(size_t i = 0; i < N; i++) // all elements
{
for(size_t j = 0; j < now->size(); j++)
{
if (j > 0 && j < N)
(*next)[i] += ExpensiveFunction((*now)[j-1], (*now)[j], (*now)[j+1], (*next)[i])
else if (j == 0)
(*next)[i] += ExpensiveFunction2((*now)[j], (*now)[j+1], (*next)[i])
else if (j == M-1)
(*next)[i] += ExpensiveFunction3((*now)[j-1], (*now)[j], (*next)[i])
}
}
vector<double> *intermediate = now;
now = next;
next = intermediate;
}

最佳答案

优化的一般建议是做 profiling第一的。我假设您已经这样做了,并且发现您的“复制和访问操作”(如问题中所述)必须进行优化。

在这种情况下,请注意名称 ExpensiveFunction具有误导性,因为当一些复制和访问操作在您的代码中如此重要时,它不可能很昂贵。

优化的“一般模式”是:查看您的内部循环,并尝试删除不必要的操作。

在你的例子中,你有以下内容:

  • for (...; j < now->size(); ...) - 尝试替换 now->size()通过 M - 很有可能你的编译器已经做到了,但你永远不知道......
  • if (j > 0 && < j < N) - 如果将循环分为 3 个部分(第一次迭代;中间迭代;最后一次迭代),则可以完全删除这些检查
  • now[j-1], now[j], now[j+1] - 一些 C++ 实现坚持对每次访问进行数组边界检查(C++ 不需要);如果您的是这样,请尝试禁用检查,或更换您的 std::vector通过 std::array或者(如果它没有帮助)通过 C 风格的数组
  • next[i] = ... - 如上所述
  • 您可以尝试优化昂贵函数中的代码...

关于c++ - 如何优化数值求解器中的大量复制和访问操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21526130/

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