2024年11月
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

tweet

  • tweets

« 2010年2月 | トップページ | 2010年4月 »

2010年3月

ボナッセ・コーポレーション

ボナ自体の改良には手を出さないつもりでいたんですが、大会が近づいてくると日和ってしまい「手軽にできることならやっとこうか」などと思いましてここしばらくボナの改良ネタを探していました。でぱっと思いついたのがbitboardのSSE化。32bitの配列というのはいかにもムダに思えます。そこでSSE化にトライしてみました。64bit化という考えもあるでしょうが、どうせなら128bitで1サイクルでやりたくなりますよね。

コン将関係者には周知のことかと思いますが蛇足ながら解説しときますと、SSE命令セットとはShogi SIMD Extensionsの略。Intel社がそのオレゴンチームとイスラエルチームの総力を結集して、コンピュータ将棋の高速化のために特別に開発した拡張命令セットです。(<嘘をつくな、嘘を)ちなみに都市伝説によるとあのGPS将棋もSSEを駆使していると言われています。

すべてのルーチンをSSE化したわけではなく、プロファイラでみて比較的実行時間が多くかつSSE化しやすそうなものをいくつか選んでSSE化しました。主にattack系と[un]makemove系。これらだけでも実行時間で約15%で、いくつかの局面で測ったところCore i7で一割弱高速化できたようです。ただしPentium 4ではほとんど速くなってなかったりもして、CPUによってYour Mileage May Varyです。

evaluateやmovegen系への適用も当然考えたんですが、このあたりは
 - bitboardからFirstOneで一つ選ぶ
  - そのビットに対して何かする
  - Xorでそのビットを落とす
というループが多いんですが、このFirstOneにあたるのがSSEでうまい命令がないんですよね。そこで挫折したためできてません。Intelさんにはぜひxmmに対するbsr/bsf命令の実装を望みたいところです。

SSEプログラミングにはなじみのない方も多いかと思いますが、たとえばボナだと、shogi.hで

#define BBOr(bb,bb1,bb2)         (bb).p[0] = (bb1).p[0] | (bb2).p[0],         \
                                 (bb).p[1] = (bb1).p[1] | (bb2).p[1],         \
                                 (bb).p[2] = (bb1).p[2] | (bb2).p[2]

とあるところへ

#define castbb(bb)   (*((__m128i*)(&(bb))))
#define BBOrS(bb,bb1,bb2)        bb = _mm_or_si128( castbb(bb1), castbb(bb2) )

などとしておき、*.cでは

#ifndef USE_SSE
    bitboard_t bb_set_clear;
    BBOr( bb_set_clear, abb_mask[from], abb_mask[to] );
#else
    __m128i bb_set_clear;
    BBOrS( bb_set_clear, abb_mask[from], abb_mask[to] );
#endif

という感じ。元のボナがこの辺統一的に書かれているので、こちらも作業しやすかったです。

ハマった点としては、BBContract相当はSSE4のPTESTを使ってるんですが、i7はそれでよくてもPhenomIIはSSE4がないためIllegal Instructionになってしまい、extract_epi16を6回使うはめになったりとか。あとRankは32bitに収まるためボナでは別扱いになってることが多いんですが、こっちはxmm上でやらないといかんのでset_epi32にしたりとか。_mm_set_epi32(*,*,aslide[sq].ir0)とか書けるとウマーなんですが、set_epi32の第3オペランドは即値でないとダメ、とか orz (これにはマジがっくり来た)

まあそんなこんなで作ったのをfloodgateに投入したのがbonasse(ボナッセ)です。東京は多摩センターに本部のある某教育関連企業とは全く関係ありません。進○ゼミ、とか言っても若い人には通じないのかな。マシンリソースの関係で対局数十分でないですが、いちおうレーティングはこちら:

Bonasse

まあ2682ははっきり言ってできすぎで、指運に恵まれたんでしょうが、元のボナよりかなり有意に強くはなってるでしょう。ちなみにこれ、1コアです。4コアだとどうなるんだろう。なおSSE以外にもいろいろいくつかいじってますんで、SSEだけでここまで強くなるわけではないです。

さて次は、これらの改造をボンクラーズに組み込むんだけど…これがなかなか一筋縄ではできなくて orz

R2600突破

Screenshot_2

nanaoが8コアボンクラーズです。

おうちでHPC

PhenomII X4買いました。

PhenomII X4 965 BE \17k
MB           \8k
Memory 2Gx2 \10k
HD           \4k
ケース・電源  \6k
計          \45k

ボンクラーズ環境を新しいマシンに入れるのをもう4,5回やってて、まだやりそう^^; やり方メモしておこう。ベースはUbuntu 9.04。

* パッケージとってくる
   % sudo apt-get install openssh-server nfs-common libstdc++5
# libstdc++5はicc(11.1)が必要とする nfsサーバにするならportmap, nfs-kernel-serverも

* icc インストール
  % ./install.sh

* openmpi ビルド
  % ./configure CC=icc CXX=icpc --prefix=/my/path ; make all ; make install

* ssh 相互乗り入れ
  A> ssh-keygen -t rsa   # ~/.ssh/id_rsa.pub ができる
  A> scp  ~/.ssh/id_rsa.pub B:/home/mine
  B> cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
   # A,Bはマシン名。それぞれのマシン上でお互いにやる。

* 環境設定
  次のファイルを作っておき、~/setpathsとかにしとく。これを.bashrcでsource する
   source /opt/intel/Compiler/11.1/064/bin/iccvars.sh ia32
   export PATH=/openmpi/install/dir/bin:$PATH
   export LD_LIBRARY_PATH=/openmpi/install/dir/lib:$LD_LIBRARY_PATH

* nfs設定
   A> mkdir /mnt/hoge
   A> vi /etc/hosts
     - /mnt/hoge B:/wanted/dir nfs noauto,rw 0 0 とかいう行を追加
   B> vi /etc/exports
     - /wanted/dir 192.168.xx.yy(rw,no_root_squash,async) とかいう行を追加
   B> exportfs -a    # reboot後は不要
   A> mount /mnt/hoge

* 共有メモリ設定
    vi /etc/sysctl.conf
     - kernel.shmmax = 268435456 とかいう行を追加

今家にデスクトップ3台、ノート1台になりました。これ以上増えるならnisとかいるんじゃ?インストールもkickstartとかにしないと。家なのにセンター並 ^^;

キーボードもモニタもマウスもなしのだるま状態。ネットワークだけつなげて、他のマシンからログインしてます。狭いし、切替器買うのももったいないし。

Ubuntuインストールの時の話ですが、チップセットがAMD 785なんですが、Ubuntu 9.04をUSB CD driveからインストールすると、途中でブランク画面になってハングします。
modprobe: FATAL: Could not load /lib/modules/2.6.28-11-generic/modules.dep : No such file or directory
とかいうメッセージが出る。さっぱりわからずググると、以下を発見:
http://ubuntuforums.org/archive/index.php/t-1250739.html

まったく理由わかりませんが、このとおりUSBを抜き差しすると実際うまくいきました。Linuxインストールではいろいろと苦しんできましたけど、これほどわけわからん解決は初めてです^^;
「あなた大魔術師ですか!? (are you an archimage?)」にまったく同感。

3/31/2012 追記 iccインストールのときにJREがないとWarningが出ます。skipもできるのですが、次のようにすると出なくなるのでいちおう:

sudo apt-get install openjdk-6-jre

読み筋パッチ

ボナンザへのパッチで、評価値と読み筋をサーバに送るようにするものを作ってみました。もちろんボンクラーズにも使えます。パッチファイルをここに置きます。

使い方:
% patch -d /your/path/to/bonanza_v4.1.3/src/bonanza < bona_patch_sendpv
としてパッチを当てます。ソースが修正されますので、それをコンパイルします。ちなみにv4.1.3以外のバージョンでも、自分で多少修正したソースでも、修正箇所がかぶってなければ動くはずです。ボナのコマンドで "sendpv on" としてからconnectすると読み筋を送るようになります。(デフォルトでは送らない)私はこんな↓ファイルを用意して(たとえばbnzcmdとする)

beep off
sendpv on
connect wdoor.c.u-tokyo.ac.jp 4081 myprogname floodgate-900-0,mytrip

で、"cat bnzcmd | bonanza" として動かしてます。

winでやってる人は将棋所なりプチ将棋なり使えばいいんでしょうが、私はLinuxでキャラクタ端末でやってるため、今まで読み筋・評価値出なかったんですよね。なので作ってみました。

大したコードではないので利用・再配布自由とします。自己責任でご自由にお使いください。

ボンクラーズでは並列マスターのpv情報をボナのデータ構造にコピーするんですが、今のところそれを最低限必要な1、2手しかやってないため、読み筋の方はそのぶんしか出なくてあまり意味ないですが、評価値は出ます。floodgateでグラフを見ると、こんな感じ:

Screenshot

だいぶ相手の評価と差が開いてますw 100手めあたりとか、1000くらい離れてないか?勝手読みでもしてるんでしょうかね。

« 2010年2月 | トップページ | 2010年4月 »