NSSetとライフゲーム(その10、おまけ) [プログラミング - NSSetとライフゲーム]
こないだのライフゲームをiMacの上でコンパイルしてみた。
そのままuniversal binaryに設定してコンパイルして動かすと、何も表示されない。
一カ所バイトオーダを決めうちしてるところがあって、このせいだった。カラーテーブル(NSColorの詰まったNSArray)から色を読み込んで、NSBitmapImageRep用のパックされた32ビットカラーに変換するところ。
エンディアンをチェックするようにした。どっちの石がどっちのエンディアンだったっけ?
適当に書いて、あたった方にする。確率1/2。ええかげん。
static const float allbytes = 255.0f; float r, g, b, a; unsigned int rr, gg, bb, aa; [[colorTable colorAtIndex:n] getRed:&r green:&g blue:&b alpha:&a]; rr = (unsigned int)(r * allbytes); gg = (unsigned int)(g * allbytes); bb = (unsigned int)(b * allbytes); aa = (unsigned int)(a * allbytes); #if __BIG_ENDIAN__ cTable[n] = (rr << 24) + (gg << 16) + (bb << 8) + aa; #else cTable[n] = (aa << 24) + (bb << 16) + (gg << 8) + rr; #endif
Xcodeで初めてコンパイラダイレクティブを使った。これ、ここに書いたことを忘れんようにせな。
しかしこういうコーディング、いかんねえ。そんなに効率を要求するところではないのに。まず、かっこわるいわ。今度やるときはなんとかしよ。
とりあえずこれで動くようになった。 スピード比較。iMac(mid07)2.0GHz 1GBで、前にやったhashの取り出しビット数に対してF-ペントミノの200世代までの時間、
ビット長さ 1回目 2回目 3回目 0 8.744 8.739 8.783 8 4.424 4.402 4.414(単位秒)
ありゃー、1.33GHzPowerBookG4が40〜20秒だったので4、5倍違いますな。ロゼッタで開いても20〜10秒ぐらいでPowerBookG4より倍ほど速い。
こんなに違うのお?クロックがだいたい倍だけど、Single Threadなので計算はMain Threadで動いている。でっかいメモリを要求している訳でもないし、なんでこんなに差がつくのかな?
それと面白いことを発見した。動かしながらアクティビティモニタを見てると、コアを乗り換えてる。
このとき、ほかのアプリはほとんど動いてなかった(CPU占有率が90%以上)ので、一方のコアだけが働いてる。コンテキストスイッチのたびに適当に割り振るとすると、今の場合両方のコアを平均的に使うことになるはずなのに。 どうなってるんやろか?
よく見ると下の赤い点々が緑の山と逆の方向についている。この赤いのはシステムのCPU時間で、入出力やネットワークなんかの、UnixのいわゆるSystem Callの時間。System Callに使っていないコアの方に割り振られているんだろな。
System Callはひとつの作業が終わるまでひとつのコンテキストを使うので、コアは固定される。しかし、こんな長い間(数秒以上)ひとつのSystem Callがかかるわけないし、Machのkernel呼び出しのレベルではリエントラントだったと思うので、例えばHDDの読み書きは1本だけ、とか言うことはないと思う。
同じSystem Callが続いたらキャッシュをクリアしないですませる、とかそういうことをするせいでSystem Callが走るコアに偏りが出るのかな。
2007-11-10 11:12
nice!(0)
コメント(0)
トラックバック(0)
コメント 0