TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

将棋AIの進捗 その10(Linux対応)

ChainerのMNISTサンプルをUbuntuで動かすとWindowsよりも早いことがわかったので、dlshogiの自己対局Ubuntuで行えるようにした。

AperyのMakefileを参考に、g++でビルドできるようにした。

Windowsで32スレッドで1手800シミュレーションで自己対局を行うと、2.68局面/秒で生成できる。

Ubuntuで同じ条件で実行すると、期待に反して1.03局面/秒でしか生成できなかった。
コンパイルオプションはAperyにbmi2をターゲットにしたときに合わせているがなぜか遅い。
スレッド数を減らして、16スレッドで実行すると、2.08局面/秒になった。
Windowsで16スレッドで実行すると、1.31局面/秒になる。Windowsではスレッド数が多い方が効率がよい。

CPU側のマルチスレッドの効率に問題がありそうだ。
なお、UbuntuのCPUはCore i9 10コアで、WindowsCore i7 4コアなのでUbuntuの方がCPU性能がよい。

Ubuntuを入れているPCをWindowsで起動して実行すると、同じ条件で、3.16局面/秒で生成できた。
スレッドを120まで増やすと、7.63面/秒になった。
Windowsの場合はCPUのコア数が多い方が早くなる。

対局用の実行ファイルで開始局面を探索させてときのプレイアウト数/秒は、

Ubuntu 553
Windows 4438

と、こちらもUbuntuが非常に遅い結果になった。

原因を調べるのに時間がかかりそう・・・

Makefile
CC = g++
CFLAGS = -std=c++11 -Wextra -Ofast -MMD -MP -fopenmp -DNDEBUG -DHAVE_SSE4 -DHAVE_SSE42 -DHAVE_BMI2 -msse4.2 -mbmi2 -DHAVE_AVX2 -mavx2
LDFLAGS = -lpthread -lboost_python3 -lboost_numpy3 -lpython3.6m -flto
INCLUDE = -I../usi -I../cppshogi -I$(PYENV_ROOT)/versions/anaconda3-5.0.1/include/python3.6m
LIB = -L$(PYENV_ROOT)/versions/anaconda3-5.0.1/lib

target = bin/make_hcpe_by_self_play
sources = self_play.cpp
usi_sources =  mate.cpp ZobristHash.cpp
cppshogi_sources = bitboard.cpp book.cpp common.cpp cppshogi.cpp evalList.cpp evaluate.cpp generateMoves.cpp hand.cpp init.cpp move.cpp movePicker.cpp mt64bit.cpp pieceScore.cpp position.cpp search.cpp square.cpp thread.cpp timeManager.cpp tt.cpp usi.cpp
objects = $(addprefix obj/, $(sources:.cpp=.o))
usi_objects = $(addprefix obj/, $(usi_sources:.cpp=.o))
cppshogi_objects = $(addprefix obj/, $(cppshogi_sources:.cpp=.o))

$(target): $(objects) $(usi_objects) $(cppshogi_objects)
	@[ -d bin ] || mkdir -p bin
	$(CC) -o $@ $^ $(LIB) $(LDFLAGS) $(CFLAGS)

obj/%.o: %.cpp
	@[ -d obj ] || mkdir -p obj
	$(CC) $(CFLAGS) $(INCLUDE) -o $@ -c $<

obj/%.o: ../usi/%.cpp
	@[ -d obj ] || mkdir -p obj
	$(CC) $(CFLAGS) $(INCLUDE) -o $@ -c $<

obj/%.o: ../cppshogi/%.cpp
	@[ -d obj ] || mkdir -p obj
	$(CC) $(CFLAGS) $(INCLUDE) -o $@ -c $<

all: $(target)

clean:
	rm -f $(objects) $(usi_objects) $(cppshogi_objects) $(target)