【问题标题】:optimize a c code on nested loop优化嵌套循环上的 c 代码
【发布时间】:2013-06-13 11:14:55
【问题描述】:

我有以下代码

for(i=0;i<16;i++)
  for(j=0;j<16;j++)
  {
     in=(i+u*j+rl+rc)&15;
     jn=(v*i+(u*v+1)*j+rc)&15;
     x1[i*16+j]=x2[in*16+jn];
   }

一些注意事项:

  1. rl,rc,uv 是随机值,范围从 0 到 15
  2. x1x2 是 256 个值的数组,每个数组值的范围在 0 到 255 之间
  3. 如果我想使用查找表实现此代码需要 16MB 和这么大的内存

【问题讨论】:

  • 这里有什么问题?
  • 家庭作业?如果没有,请不要打扰 - 现代编译器会解决这个问题。保持代码可读,直到您有空闲时间或怀疑性能问题时对其进行分析。它被称为源代码,因为人类阅读它。
  • 为什么要关闭?我认为这是一个没有很好问的有效问题。我认为这里有优化的空间。 LUT 和更智能的数学的某种组合。不过还没想出解决办法。
  • 一般来说,如果没有深入了解底层硬件,手动优化任何东西是没有意义的。在 for 循环的情况下,如果不深入了解缓存内存硬件(如果存在于特定系统上),它尤其没有任何意义。
  • ...另外,如果你反复选择带有1-2个晦涩字母的变量名,并且有在同一行写5个或更多运算符的习惯,并且用十进制表示法编写位掩码,那么程序性能至少是您的问题之一......

标签: c performance optimization for-loop


【解决方案1】:

这里有一个想法:

尝试提取至少在内部循环之外不会更改的部分计算。例如,in 计算中的i + rl + rc 不需要在循环内。一旦你有了它,你就会意识到in 的值每次迭代都会增加u,当然是模16。因此,您可以进行加法,而不是乘法。

jn 计算还包含一些您可以提取的内容。

当然,这是假设您确实知道这是一个性能瓶颈(分析它!)并且编译器不够聪明,无法为您进行这样的优化。如有疑问,请检查组件。

【讨论】:

  • 我很确定编译器会为你做到这一点。
  • 它可能——也可能不是。我很想说它会,但听起来海报在某些嵌入式系统中工作,我不相信那些编译器。
  • 我很确定,即使是最低端微控制器的编译器也会进行这种优化。 i + rl + rc 的结果将被临时放入寄存器或堆栈中。但是,当然,这又是另一个例子,说明为什么在不了解预期硬件的情况下手动优化代码是没有意义的
【解决方案2】:

您可以尝试一些想法:

您可以为uv 的所有组合构建一个查找表,这只需要64k 内存。 rlrc 在水平和垂直方向上作为恒定偏移量工作(它们可以移动到最后一条语句,并且不必参与 injn 的计算)。这将减少您必须做的数学运算。

与任何其他性能优化一样,您首先需要查看这是否真的是瓶颈。可能是内存要慢得多,引入大型查找表只会减慢速度。

【讨论】:

    猜你喜欢
    • 2015-05-29
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 2013-05-30
    • 1970-01-01
    • 2019-04-21
    • 2021-01-21
    • 2020-08-28
    相关资源
    最近更新 更多