GPU を用いたコンピュータリバーシの高速化

GPU を用いたコンピュータリバーシの高速化
美濃研究室 T07KF007 奥祐二
グラムを作成する.
1 はじめに
5 minimax 法と αβ 法
現在,画像処理に使われている GPU の高い並
列計算処理を汎用計算処理に応用する研究・開
発がされている.
本研究では,αβ 法によるゲーム木探索を
GPU を用いて大規模並列化することで,探索の
高速化をする.そして最終的にはリバーシの完
全読みを達成する事を目的とする.
minimax 法とは,「自分にとっての最善手は
相手にとっての最悪手」という考えで,相手は
自分にとって最悪の手を打ってくると仮定して,
深さ優先探索(DFS)で自分の最善手を求めるア
ルゴリズムである.[3]
しかし,minimax 法は全ての手をしらみ潰し
に探索するため,ゲーム木の大きさによって探
索ノードが膨大な量になるという欠点がある.
そこで minimax 法における絶対に採用される
ことがない手を枝刈りして効率を改善した αβ
法がある.枝刈りの判定方法は,1 つ上のノー
ドの値を,相手の手番の場合は下限値(α)に,
自分の手番の場合は上限値(β)に設定し,こ
の値を越えた場合に枝刈りをする.αβ 法の枝
刈りの例を図 1 に示す.
例では,相手の手番の時に,α=-3 で,その
範囲に当てはまらない-8 という評価が得られた.
したがって,未探索の子ノードは枝刈りされる.
2 コンピュータリバーシとは
リバーシとは,2 人用のボードゲームで,
8×8 の升目を持つ盤面に,交互に石を置いてい
き,最終的に石の数が多い方が勝つゲームであ
る.コンピュータリバーシとは,リバーシにお
けるプレイヤーの思考をコンピュータにさせる
プログラムである.
3 ゲーム木探索の現状
ゲーム木探索アルゴリズムはゲーム木を使っ
て最善手の探索をするアルゴリズムである.
ゲーム木は木構造であり,局面の評価値をノー
ドで表し,エッジは打った手を表す.今までに
多くのゲーム木の逐次探索アルゴリズムや並列
探索アルゴリズムの研究がされている.その結
果として,1993 年には,6×6 マスのリバーシの
完全読みが達成された.[1]しかし,未だに標準
的な 8×8 マスのリバーシの完全読みは成されて
いない.理由としては,先読みする深さが増え
るほど,探索するノード数が膨大になるという
問題があるためである.
: 自分の手番
: 相手の手番
-3
-3
15
-8
-3
-8
-7
5
-7
図 1:深さ 2 の αβ 法
6 GPU を用いた実装
4 GPU
本研究では,ゲーム木探索の部分を GPU 上で
動作させる.図 2 に深さ2の場合の並列化を示
す.ゲーム木のルートノードから伸びるノード
を各スレッドに割り当てる.全スレッドの探索
が終了した時,GPU は各スレッドの最上位の
ノードの評価値を CPU に返す.そして,CPU は
その中で評価値の高い手を選ぶように実装した.
スレッドはストリーミング・マルチプロセッ
サ(SM)1つにつき1つのスレッドを動作させ
るため,各スレッドは独立となり,スレッド毎
に並列して αβ 探索をする.
今回使用した GPU は再帰呼び出しがサポート
GPU を画像処理では無く,他の一般的な用途
で利用することを GPGPU という.
GPGPU の特徴として大規模なマルチスレッド
がある.GPU はコンテキストスイッチが高速な
ため,たくさんのスレッドを動かすことで性能
を引き出す.したがって,GPGPU ではたくさん
のスレッドを動かすことで,大規模並列化を図
ることができる.
NVIDIA 社は GPU に対する GPGPU 開発環境の
CUDA[2]を提供している.本研究では,この
CUDA を使って GPU 上でゲーム木探索をするプロ
1
されていなかったため,αβ 法のバックトラッ
キングを実装した.
: 自分の手番
: 相手の手番
-8
-3
スレッド1
-8
実行時間 [ms]
-3
15
1000
-3
CPU
-7
17
スレッド2
-9
-7
100
10
GPU
実行時間
1
CPU
実行時間
0
スレッド 3
1
図 2:GPU を用いた αβ 法の並列化
4
7 10 13 16 19 22 25 28
コンピュータの打った手の番号
図 3:深さ 3 の αβ 法において
7 ゲーム木探索の高速化の実験
GPU と CPU での実行時間
7.1 実験方法
表 1:スレッド間の実行時間の分散
GPU を使って,深さ3のゲーム木探索を,深
さ 2 のゲーム木に分割して,スレッド 14 個で並
列探索する.コンピュータがこの探索方法をす
る時の,並列探索するスレッド全てが終わるま
での時間と,並列探索するスレッド1つ1つの
実行時間を,一連のゲームを通して,コン
ピュータの各手について計測をする.高速化の
比較のため,CPU も同様に実験を行う.
実験環境は以下の通りである.
OS : Ubuntu 9.10 (32bit)
CPU: Intel Core i7 (2.67GHz)
GPU: NVIDIA GeForce 9800 GT
(Compute Capability:1.1, SM 数:14)
比率
打った手
[C P U / G P U ] の 番 号
0 .4 9
9
0 .4 8
8
0 .4 7
29
0 .4 6
30
0 .4 1
17
0 .4 0
16
0 .3 6
12
0 .3 5
4
合計時間
[m s ]
1 0 1 6 .3 8
1 1 5 6 .6 8
7 .8 1
2 .1 4
6 2 6 .9 9
7 2 4 .0 4
5 5 8 .2 8
4 7 8 .0 0
探索した
スレッド数
14
13
3
1
13
14
10
9
分散
3 1 .2 4
9 9 .6 8
0 .0 3
0 .0 0
5 9 .3 6
3 6 .5 2
5 0 .3 1
7 6 .7 8
8 まとめと今後の課題
本研究は,GPU を用いてコンピュータリバー
シのゲーム木探索を並列化し,高速化ができた
かどうか実験した.
実験から,GPU を用いてゲーム木探索の並列
化を行ったが,本研究の手法では GPU を使って
ゲーム木探索の高速化はできなかった.
今後の課題として,マルチスレッドのスレッ
ド数を増やすこと,ゲーム木の分割方法がある.
そこで解決策としては,ゲーム木を葉ノードま
で並列化する方法が考えられる.葉ノード単位
でゲーム木を分割できれば GPU の性能を引き出
すことが可能となり,高速化する見込みがある
と考える.
7.2 結果と考察
並列探索するスレッド全てが終わるまでの
実行時間の結果を,実行時間を対数目盛にし
たグラフで図 3 に示す.スレッド1つ1つの実
行時間から得られた,スレッド間の探索にかか
る時間の標準偏差と,実際に探索を行ったス
レッドの数を表1に示す.表1は CPU の実行時
間と GPU の実行時間を比較して,その中で速い
順に並べて上位 8 個のみのデータを示す.
図3から,GPU は CPU と比べて約 10 倍遅かっ
た.表1から,GPU の高速化につながる以下の
特徴 3 つが得られた.
• 探索したスレッド数が多い
• スレッドの実行時間の分散が少ない
• 分割したゲーム木が極短時間で終わる
結果から,スレッドの探索時間が短くなるよ
うな負荷分散や,ゲーム木の分割方法の見直し,
マルチスレッドのスレッド数を増やす必要性が
あることがわかった.
9 参考文献
[1]Joel Feinstein:”Amenor wins world 6x6
Championships!”,http://www.maths.nottingham
.ac.uk/personal/jff/,1993
[2]青木尊之,額田彰:”はじめての CUDA プログラミ
ング”,工学社,2009
[3]Seal Software:”リバーシのアルゴリズム”,工
学社,2003
2
標準偏差
5 .5 9
9 .9 8
0 .1 7
0 .0 0
7 .7 0
6 .0 4
7 .0 9
8 .7 6