No Such Blog or Diary

«Prev || 1 | 2 | 3 |...| 779 | 780 | 781 |...| 1194 | 1195 | 1196 || Next»

CPU依存なのか

手元のCPUだと cmovb を使ったプログラムが速いのだけど,別のCPUのマシンで動かしたら jb のが速かった.悩ましい.

とりあえずコンパイラとCPUの気分次第なのでどうのしようもないという結論にしちゃえ.

箱詰め

パッキング問題を解きまくる日々.思ったより箱の数が多くなりそうな予感……

つーか夏タイヤ邪魔だなぁ.

閑話休題.

論文なおすべ.

閑話休題.

キーボードの e の反応が鈍くなってて入力ミス頻発で困る.

コンパイラとの戦い再び

意味的に下のループと等価な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日終わった.はぁ.

締切伸びた

寝る.

古いコンパイラはやっぱお馬鹿よね

クラスタに標準で入っているコンパイラが古い(gcc 4.1.2)せいで,同等の速度のコードにコンパイルされるべき2つのプログラムの実行時間に大きな差が出てしまって困った.手元の環境(gcc 4.6.3)では同じ速さのコードにコンパイルされたのに…… お話が狂ってしまう.

ということで,コンパイラの進化を直に感じた今日このごろ.

クイニーアマンだけ無い……

セブンイレブンに行ってクイニーアマン買おうかと思ったのに,クイニーアマンのところだけ商品が無くなっていた…… 他のところは充填120%な状態だったのに.

やる気が無くなった.寝る.

«Prev || 1 | 2 | 3 |...| 779 | 780 | 781 |...| 1194 | 1195 | 1196 || Next»
Search
Feeds

Page Top