1

ARM、Bfinなどのさまざまなターゲットで一連の操作を実行しようとしています...しかし、Cで単純なコードを記述し、操作ごとにコンパイルするたびに、2回のロードと不要な1回のストアが発生しますすべての操作に。

    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が、うまくいきませんでした。

4

2 に答える 2

0

ベンチマークを行い、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;
}
于 2012-11-19T10:59:47.820 に答える
0

操作によります。Gcc は高レベルの最適化を把握できません。

int a(int b, int c)
{
  b-=c;
  c-=b;
  b-=c;
  c-=b;
  b-=c;
  c-=b;
  return c;
}
于 2012-11-19T10:34:01.637 に答える