[ARM入门] 嵌入式代码优化技巧--循环展开

[复制链接]
1354|0
 楼主| 呐咯密密 发表于 2024-3-25 10:18 | 显示全部楼层 |阅读模式

有时候,可以牺牲一点代码的简洁度、减少循环控制语句的执行频率以提高性能。

无依赖的循环展开:

  1. process(array[0]);
  2. process(array[1]);
  3. process(array[2]);
  4. process(array[3]);

优于:

  1. for (int i = 0; i < 4; i++)
  2. {
  3.     process(array[i]);
  4. }

有依赖的循环展开:

  1. long calc_sum(int *a, int *b)
  2. {
  3. long sum0 = 0;
  4. long sum1 = 0;
  5. long sum2 = 0;
  6. long sum3 = 0;

  7. for (int i = 0; i < 250; i += 4)
  8. {
  9.   sum0 += arr0[i + 0] * arr1[i + 0];
  10.   sum1 += arr0[i + 1] * arr1[i + 1];
  11.   sum2 += arr0[i + 2] * arr1[i + 2];
  12.   sum3 += arr0[i + 3] * arr1[i + 3];
  13. }

  14. return (sum0 + sum1 + sum2 + sum3);
  15. }

优于:

  1. long calc_sum(int *a, int *b)
  2. {
  3. long sum = 0;

  4. for (int i = 0; i < 1000; i ++)
  5. {
  6.   sum += arr0[i] * arr1[i];
  7. }

  8. return sum;
  9. }

尽可能把长的有依赖的代码链分解成几个可以在流水线执行单元中并行执行的没有依赖的代码链,提高流水线的连续性。通常4次展开为最佳方式。


您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:苏州澜宭自动化科技嵌入式工程师
简介:本人从事磁编码器研发工作,负责开发2500线增量式磁编码器以及17位、23位绝对值式磁编码器,拥有多年嵌入式开发经验,精通STM32、GD32、N32等多种品牌单片机,熟练使用单片机各种外设。

567

主题

4082

帖子

56

粉丝
快速回复 在线客服 返回列表 返回顶部