【问题标题】:How to optimize load and stores?如何优化加载和存储?
【发布时间】:2012-11-19 18:59:47
【问题描述】:

我试图在 ARM、Bfin 等不同的目标上执行一堆操作...但是每次我用 C 编写一个简单的代码然后为每个操作编译它时,它都有 2 个加载和一个存储这对于每个操作都是不必要的。

    ldr     r2, [fp, #-24]
    ldr     r3, [fp, #-28]
    add     r3, r2, r3
    str     r3, [fp, #-20]
    ldr     r2, [fp, #-36]
    ldr     r3, [fp, #-40]
    add     r3, r2, r3
    str     r3, [fp, #-32]
    ldr     r2, [fp, #-44]
    ldr     r3, [fp, #-48]
    add     r3, r2, r3
    str     r3, [fp, #-20]
    ldr     r3, [fp, #-16]
    add     r3, r3, #1
    str     r3, [fp, #-16]

当我打开任何优化选项时,即使是-O1,它只会计算结果并将其存储在输出中:

    subl    $24, %esp
    movl    $4, 4(%esp)
    movl    $.LC0, (%esp)

无论如何,我可以在不一遍又一遍地获取相同变量的情况下进行操作吗?我试过gcc -fgcse-lm-fgcse-sm 但没用。

【问题讨论】:

  • 如果操作可以简化为简单的代码,为什么还要更复杂的代码呢?最终,如果它很重要,您可以进入汇编程序。但是如果优化代码产生相同的结果,我想不出我想要比优化代码更长的东西的原因。如果在代码中引用某些内容时必须阅读,您可以将其标记为volatile。但这很恶心,而且可能无法达到您想要的效果。
  • C 语言并不真正支持直接在源代码中包含汇编代码(这不是标准,但它是建议的功能),但实际上许多编译器都支持此功能,您可以编写代码如果您非常关心性能并且能够使用汇编语言,则可以在 C 中使用 C 中的函数并在汇编中定义它。
  • 谢谢,我需要一个充满相同操作的长函数才能在目标处理器中找到该操作的平均延迟。无论如何我想避免编写程序集,但看起来我必须在某些点。
  • @user1833939 你应该问你想要什么。您想要进行一些基准测试,而您的问题似乎是编译器确实优化了您的代码。只是猜测,因为你实际上并没有写。

标签: optimization gcc load store


【解决方案1】:

这取决于操作。 Gcc 无法为

int a(int b, int c)
{
  b-=c;
  c-=b;
  b-=c;
  c-=b;
  b-=c;
  c-=b;
  return c;
}

【讨论】:

    【解决方案2】:

    如果您想在 gcc 中进行基准测试并避免优化器的常量折叠和死代码消除,您需要使用非常量作为输入并确保结果到达某个地方。

    例如,而不是使用

    int main(int argc, char** argv) {
        int a = 1;
        int b = 2;
    
        start_clock();
        int c =  a + b;
        int d =  c + a;
        int e =  d + b;
        stop_clock();
        output_time_needed();
    
        return 0;
    }
    

    你应该使用类似的东西

    int main(int argc, char** argv) {
        int a = argc;
        int b = argc + 1;
    
        start_clock();
        int c =  a + b;
        int d =  c + a;
        int e =  d + b;
        stop_clock();
        output_time_needed();
    
        return e;
    }
    

    【讨论】:

      猜你喜欢
      • 2019-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-28
      • 2011-03-19
      相关资源
      最近更新 更多