SSブログ

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が走るコアに偏りが出るのかな。
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。