【问题标题】:How to align C for-loop body w/ GCC?如何使用 GCC 对齐 C for 循环体?
【发布时间】:2012-04-10 10:50:09
【问题描述】:

在我们的嵌入式架构中,我们有一个 64 位 IAB(指令对齐缓冲区)。为了优化获取序列,要求循环体开始与 8 字节边界对齐。

使用.balign 指令在汇编中很容易实现这一点,但我找不到提示 C 编译器对齐代码的语法。

尝试在 for 循环之前使用带有 .balign 指令的内联汇编是行不通的,因为它会对齐 for 循环序言(设置)而不是循环体本身。

在循环内部的asm() 行执行相同操作,将nop-s 添加到循环体中,这会花费宝贵的周期。

编辑1:假设代码:

    __asm__ volatile("nop");  
    __asm__ volatile("nop");  

    for (j0=0; j0<N; j0+=4)
    {
        c[j0+ 0] = a[j0+ 0] + b[j0+ 0];
        c[j0+ 1] = a[j0+ 1] + b[j0+ 1];
        c[j0+ 2] = a[j0+ 2] + b[j0+ 2];
        c[j0+ 3] = a[j0+ 3] + b[j0+ 3];
    }

我希望第一个 c=a+b 与 8 字节地址对齐。在初步编译后,我可以像上面一样添加nop-s,但这是一个临时解决方案,会因第一次代码更改而中断。

编辑 2:感谢 @R..,解决方案是使用 -falign-loops=8 编译器选项。

【问题讨论】:

  • 所以本质上,您希望 nop-s 会导致循环 body 对齐,但您希望那些 nop-s 在循环 prolog?
  • @ruakh - 是的,虽然我不在乎nop-s 是否在序言本身中生成,只要循环末尾的分支指令指向对齐的内存位置。
  • 明白。这是一个很好的问题!
  • 嗯,这不是 GCC 的 -falign-loops 选项的用途吗?
  • @R.. - 这似乎是诀窍!请把它作为一个答案,以便我可以代表并接受它。

标签: c gcc for-loop alignment memory-alignment


【解决方案1】:

嗯,这不是 GCC 的 -falign-loops 选项的用途吗?

【讨论】:

  • 是的,但是如果您只想影响单个循环怎么办。 GCC有什么解决办法吗?
  • 对于单个函数,您可以使用#pragma GCC optimize 或等效属性。我不知道你是否可以在单循环级别上做到这一点。如果没有其他方法,您可以通过将循环放在嵌套函数中并将属性放在嵌套函数中来实现这一点......?
  • 有针对性的单功能优化仍然比项目范围的选项好得多,因为它在某些情况下可能是好的(热循环)而在其他情况下可能是坏的(罕见的循环)。不幸的是,#pragma GCC optimize "align-loops=xx"__attribute__((optimize("align-loops=xx"))) 在我的测试中似乎都没有产生任何影响(在生成的二进制文件上相同的 md5sum)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-03
  • 2011-12-22
相关资源
最近更新 更多