アカウント名:
パスワード:
「ループ展開は勝利」ってな格言もありましたな。
昔はループ内にif文を書いたら分岐予測ミスのペナルティで遅くなるため、それを回避するビット演算に直すという方法も盛んに紹介されていましたね。
今はif文使った方が速いという言及もちらほら見られるのですが、実際最近のチューニング事情はどうなのでしょう?SIMDではまだif文使いづらい印象はあるのですが。
ループ内に限った話じゃないけど、ARMみたいに各命令毎に実行条件を設定できるCPUなら、
たとえば
if(a == b) c += a; else c += b;
程度のコードは
CMP a, bADDEQ c, c, aADDNE c, c, b
のような条件分岐を排した機械語に翻訳することが可能であり、それを意識したコードを書くことはありますねぇ。
その関係で、数式中で三項演算子を多用したりもするんですが……
結局のところコンパイラのオプティマイザ
たとえば if(a == b) c += a; else c += b; 程度のコードは
そのコードなら ADD c, c, b だけで……いえ、何でもありません。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
一つのことを行い、またそれをうまくやるプログラムを書け -- Malcolm Douglas McIlroy
そういえば (スコア:0)
「ループ展開は勝利」ってな格言もありましたな。
ループにif文 (スコア:0)
昔はループ内にif文を書いたら分岐予測ミスのペナルティで遅くなるため、
それを回避するビット演算に直すという方法も盛んに紹介されていましたね。
今はif文使った方が速いという言及もちらほら見られるのですが、
実際最近のチューニング事情はどうなのでしょう?
SIMDではまだif文使いづらい印象はあるのですが。
Re:ループにif文 (スコア:1)
for (int i=0; i< 4096; i++) {
if (i & 1) a = b[i/2] >> 4;
else a = b[i/2] & 0x0f;
:
:
}
を
a =( b[i/2] >> 4*(i&1)) & 0x0f;
と書き換えた方が速かったので、条件分岐はまだまだ重たいんだなと思いました。
分岐だけを処理するパイプラインのあるPowerとかだとどうなんでしょう?
Re: (スコア:0)
ループ内に限った話じゃないけど、ARMみたいに各命令毎に実行条件を設定できるCPUなら、
たとえば
程度のコードは
のような条件分岐を排した機械語に翻訳することが可能であり、それを意識したコードを書くことはありますねぇ。
その関係で、数式中で三項演算子を多用したりもするんですが……
結局のところコンパイラのオプティマイザ
Re:ループにif文 (スコア:3, すばらしい洞察)
そのコードなら ADD c, c, b だけで……いえ、何でもありません。
Re:ループにif文 (スコア:2)