No Such Blog or Diary
コンパイラとの戦い再び
- 2013-02-17 (Sun)
- 一般
意味的に下のループと等価な2種類のプログラムをコンパイルして,出てきたバイナリの実行時間に差が出て泣いた.
for(int i = 0; i < n; i++) r += (x[i]&1) ? x[i] : x[i] + x[i];
Expression templates 使いまくってるのでコンパイラのコントロールが難しいのだけど,とりあえずアセンブリ眺めて原因調査してどうにかした.
アセンブリを比べて最初に気づいた実行時間の差の原因は,内側の条件分岐をジャンプ命令で処理するか条件代入命令(cmov)で処理するかの違いだった.どのタイミングで cmov になってくれるのかはよくわからないが,この式のもとになる関数オブジェクト(この中では if を使っている)をゴニョゴニョ書き換えたら cmov になってくれた.
んで,これで速度おなじになるだろうとか思ったら,未だ微妙に違いが残ってて…… よく見比べてみたら,一方では r をメモリに書き戻しているのに対し,もう一方ではメモリに書き戻してないとかいう罠が発生してた.この差は,上記のループの外側に単純な if 文をひとつ置くだけで生じる.ということで,きっと if 文が何かの解析の邪魔になるんだろうなぁとか思って,その条件式を静的に判定できるときには if文を無くすように書き換えてみたら差がなくなってくれた.
とかいう戦いをしたら1日終わった.はぁ.
- Comments: 0
- TrackBack (Close): -
古いコンパイラはやっぱお馬鹿よね
- 2013-02-15 (Fri)
- 一般
クラスタに標準で入っているコンパイラが古い(gcc 4.1.2)せいで,同等の速度のコードにコンパイルされるべき2つのプログラムの実行時間に大きな差が出てしまって困った.手元の環境(gcc 4.6.3)では同じ速さのコードにコンパイルされたのに…… お話が狂ってしまう.
ということで,コンパイラの進化を直に感じた今日このごろ.
- Comments: 0
- TrackBack (Close): -
クイニーアマンだけ無い……
- 2013-02-14 (Thu)
- 一般
セブンイレブンに行ってクイニーアマン買おうかと思ったのに,クイニーアマンのところだけ商品が無くなっていた…… 他のところは充填120%な状態だったのに.
やる気が無くなった.寝る.
- Comments: 0
- TrackBack (Close): -
セブンイレブンのクイニーアマンがだいぶ薄くなったような?
- 2013-02-13 (Wed)
- 一般
久々に買ってみたら昔に比べてだいぶ高さが減ったような? 香ばしさアップかも知れんけど.
そして底面がカラメル化して固いことがあるので注意してねという注意書きも昔は無かったような? 誰か怪我して文句を言ったのかね.
とりあえず,相変わらず美味いのでまあいいか.
- Comments: 0
- TrackBack (Close): -
チクチクと邪魔な用事が入るなぁ
- 2013-02-12 (Tue)
- 一般
そして論文が進まない罠.書くことは決めてあるから確実に締切には間に合うのだが…… 何処か静かなところでガーッと一日作業したい気分.早朝は静かなのだけど.
- Comments: 0
- TrackBack (Close): -