2009/11/14

麻雀で学ぶ計算機アーキテクチャ

こんにちは。team C# の花元です。今日は地下 (学生控室) で大流行している麻雀について語りたいと思います。え、麻雀と計算機アーキテクチャに何の関係があるかって? 先日麻雀で鳴くとき、その関係性に気付いてしまったのです。

実物の牌にあまり触れていない人はこんな打ち方をします。

  1. 鳴くことを宣言する
  2. 自分の牌をさらす
  3. 相手の捨て牌から牌を持ってくる
  4. 打牌

ところが雀荘なんかで打ちなれている人は鳴くときも進行が速いんですね。どういうことかというと、こういう打ち方をします。

  1. 鳴くことを宣言する
  2. 自分の牌をさらす
  3. 打牌
  4. 相手の捨て牌から牌を持ってくる

打牌の速さに無頓着だった僕はこの打ち方に大変感心しました。どうしてこの打ち方をすると進行が速くなるのかというと、麻雀の進行に重要なのは打牌だからです。打牌が決定されることによってあがることが出来たり、次のツモが出来たりするんですね。一方、相手の捨て牌から牌を持ってくるなんて事は当然のことで進行に影響しない。

この考え方を採用したアーキテクチャがあって、これを遅延分岐と言います。先の例と対応させてみましょう。まず、打牌に相当するのが分岐命令です。その人が白を切るならば対面が鳴くのでツモを飛ばし、それ以外なら下家のツモに移れといった感じです。遅延分岐が実装されたアーキテクチャでは、このような分岐命令の次に「分岐するしないにかかわらず必ず実行される命令」を持ってきます。つまり例で言えば「相手の捨て牌から牌を持ってくる」です。

こうすることによって、分岐命令をじっくり実行しても皆イライラしません。鳴いた人が牌を持ってくる間に「この牌鳴いて喰いタンにしようかなーそれとも鳴かずにメンタンピンを目指そうかなー」とじっくり考えることが出来るのですから。その分、速くなります。高々鳴きの動作と侮るなかれ、実際のプログラムは 20% が分岐命令で出来ていますから、塵も積もれば結構速くなるようです。

こう考えると計算機アーキテクチャ高速化のヒントって、意外と身近なところにあるのかもしれませんね。

0 件のコメント:

コメントを投稿