ai65536's blog

将棋とかプログラムとか

Androidでやねうら王のベンチを測る

 

Androidでやねうら王のベンチをとる方法

 

AndroidはRootを取らなくても/data/local/tmpにファイルを転送して実行権限をつけるとシェルやターミナルから実行することができます。

 

やり方1 ADBから実行する

・ここからやねうら王をダウンロード

http://shogidroid.siganus.com/engines.html

 

・ダウンロードしたファイルを解凍する 

 以下のようなファイル構成になると思わる

 YaneuraOu-arm64-v8a  (arm用実行ファイル)

 YaneuraOu-x86_64         (x64用実行ファイル)

 book  (定跡フォルダ)

 eval  (評価値フォルダ)

 readme.txt

 

・USBでスマホを接続ADBコマンドでファイルを転送

PCのコマンドラインから以下のコマンドを実行する

 adb push YaneuraOu-arm64-v8a /data/local/tmp

adb push eval  /data/local/tmp/eval

※実行ファイルはarmかx64どちらかでいい

※ベンチにbookは不要

 

・PCからシェルで接続してディレクトリ移動

adb shell

cd /data/localt/tmp

 

・実行権限の付与

chmod 744 YaneuraOu-arm64-v8a

・ベンチの実行

./YaneuraOu-arm64-v8a bench

※ベンチのパラメータが必要な場合はそれを指定する

 

やり方2 Androidのターミナルアプリから実行する

※ShogiDroidにYaneuraOuがインストールされていること

ターミナルアプリから以下のように実行する

 

・ShogiDroidのエンジンインストールフォルダから必要なファイルをコピー

ターミナルから以下を実行

cd エンジンインストールフォルダ 

cp YaneuraOu-arm64-v8a /data/local/tmp

cp -r eval /data/local/tmp/eval

 

※エンジンインストールフォルダは環境によって違います

ディレクトリ移動

cd /data/localt/tmp

 

・実行権限の付与

chmod 744 YaneuraOu-arm64-v8a

・ベンチの実行

./YaneuraOu-arm64-v8a bench

※ベンチのパラメータが必要な場合はそれを指定する

ARMのSIMDが遅い件

 

将棋エンジンはBitboardといって盤面を128ビットで表す技術が使われています。

Intel CPUではこの部分をSIMDを使うことによって高速化していますが、ARMではSIMDを使うと速度がでません。

 

気になって夜も寝られない(嘘)のでインストラクションマニュアルで調べてみました。

 

命令の実行速度に関係するレイテンシとスループットは大まかに以下のとおり。

レイテンシ:命令の実行が完了するまでのクロック数

スループットインテル  同じ命令を再度受け入れるようになるまでのクロック数

                         ARM  同じ命令を1クロックで何個入れられるか

スループットインテルとARMでマニュアルの記載の仕方に違いがあります。

 

Intelのインストラクション

http://www.intel.com/content/dam/www/public/ijkk/jp/ja/documents/developer/248966-024JA.pdf

And命令抜粋

128bit SIMD 命令

f:id:ai65536:20161025102431p:plain

※ 06_2A=Sandy Bridge  06=Family Number 2A=Model Number

汎用命令

f:id:ai65536:20161025103125p:plain

 

ARM Cortex A72 インストラクション

http://infocenter.arm.com/help/topic/com.arm.doc.uan0016a/cortex_a72_software_optimization_guide_external.pdf

And命令抜粋

SIMD命令

f:id:ai65536:20161025103941p:plain

スループットインテル風にすると0.5

汎用命令

f:id:ai65536:20161025103623p:plain

 

 

まとめ

Intelは汎用命令とSIMD命令でレイテンシ、スループットに差がないので、単純に処理するビット数が多い方が速くなる。

・ARMは汎用命令に比べてSIMD命令のレイテンシが3倍遅い。スループットが2(0.5)なので128bitの処理に単純に3倍かかると思われる。(スループットが1でも1.5倍遅い)

 

ARMのSIMDを使ったビット演算は遅い

 

最後に

マニュアルの見方がおかしいという場合は連絡ください

Androidで技巧ベンチ

新しいスマホを買ったので技巧でベンチ

前回のベンチからソート関連をいじってノード数が同じになるようにしたものです。

スマホ Snapdragn650 1.8GHz 

Windows Core i5 2500 3.3GHz

f:id:ai65536:20160723222226p:plain

シングルスレッド性能は3倍程度違います。

Snapdragon650は A72 x2 A53x4の構成なので、

だいたいSnapdragon650 6スレッド ≒ Corei 5 2500 1スレッドくらいでしょうか。

 

まだインテルの5年前のデスクトップ用CPUに追いつく感じではないですが、随分速度上がってますね。

 

追記2017/1/13

atomタブレットを買ったので計測

CPUはAtom x5-Z8300 1.44GHz

時間43.293s NPS 73107

チェリトレ世代のATOMで64bit SSE42対応ですが、

Cortex A72を搭載したスマホに勝てないですね。

 

 

 

Sortの挙動の違い

gccとMSVCでsortの挙動が違っていたのでメモ

同じ値のものを降順にソートした場合

 MSVCでは登録した順番に並ぶ

 GCCではバラバラになる

Ideone.com - ppnbu8 - Online C++0x Compiler & Debugging Tool

 

MSVCの方が望ましい結果だけど・・・ 

 追記:維持したい場合はstable_sort()を使うらしい

 

ソース

  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. using namespace std;
  5.  
  6. struct Data {
  7. char key;
  8. int value;
  9.  
  10. Data(char key, int value)
  11. {
  12. this->key = key;
  13. this->value = value;
  14. }
  15. };
  16.  
  17. inline bool is_greater(const Data& lhs, const Data& rhs) {
  18. return lhs.value > rhs.value;
  19. }
  20.  
  21. void print(const vector<Data>& datas)
  22. {
  23. for (auto& data : datas)
  24. {
  25. printf("%c %d\n", data.key, data.value);
  26. }
  27. }
  28.  
  29. int main() {
  30. // your code goes here
  31.  
  32. vector<Data> datas;
  33.  
  34. for (char ch = 'A'; ch <= 'Z'; ch++)
  35. {
  36. datas.push_back(Data(ch, 1));
  37.  
  38. }
  39.  
  40. std::sort(datas.begin(), datas.end(), is_greater);
  41.  
  42. print(datas);
  43.  
  44. return 0;
  45. }

結果

MSVC

A 1
B 1
C 1
D 1
E 1
F 1
G 1
H 1
I 1
J 1
K 1
L 1
M 1
N 1
O 1
P 1
Q 1
R 1
S 1
T 1
U 1
V 1
W 1
X 1
Y 1
Z 1

 

 

GCC

N 1
Z 1
Y 1
X 1
W 1
V 1
U 1
T 1
S 1
R 1
Q 1
P 1
O 1
A 1
M 1
L 1
K 1
J 1
I 1
H 1
G 1
F 1
E 1
D 1
C 1
B 1

 

 

Androidで技巧を動かしてみた

Androidで技巧を動かしてみました。

ソースコードGitHubにおいています。

バグってるかもしれませんがご容赦を・・・。

https://github.com/ai5/Gikou/tree/android

 

ベンチ

技巧にyaneuraOuのベンチを移植したそのベンチ結果です。

ベンチはシングルスレッドで3つの局面を指定の深さまで探索するというものです。

今回は深さ15にしています。

f:id:ai65536:20160604232708p:plain

32bit SSE2比で約1/10の性能です。オフィシャルとほぼ同等と思われるMINGW版との比較では1/20以上の差があります。

表にはのせていませんが、スマホAtom N2701.6GHz搭載のWinXPネットブックとベンチ結果は同じくらいでした。

 

PCもスマホも最新ではありませんがスマホでレート3000がでるんでしょうか?

スマホに最適化したエンジンが出てこないとまだ届かないかな。

 

VS2015+Xamarin.Androidで共有ライブラリを使う

Makefileプロジェクトで共有ライブラリを作る

特殊なことはしてない

chmod.c

#include <sys/stat.h>

int Chmod(const char* path, int mode)
{
return chmod(path, mode);
}

 Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_LDLIBS :=
LOCAL_MODULE := chmod
LOCAL_SRC_FILES := chmod.c

include $(BUILD_SHARED_LIBRARY)

 Application.mk

# Build both ARMv5TE and ARMv7-A machine code.
APP_ABI := armeabi armeabi-v7a x86 x86_64 arm64-v8a

 

 Androidのプロジェクト~.csprojに作成した共有ライブラリを追加

・追加既存の項目、リンクとして追加で作成した共有ライブラリをAndroidのプロジェクトに追加する。

・追加したファイルのプロパティのビルドアクションをAndroidNativeLibraryにする。

f:id:ai65536:20160502120439p:plain

・プロジェクトファイルを直接編集してAbi(以下の赤字部分)を指定する

<AndroidNativeLibrary Include="../chmod/libs/x86/libchmod.so">
 <Link>libs\x86\libchmod.so</Link>
 <Abi>x86</Abi>
</AndroidNativeLibrary>
<AndroidNativeLibrary Include="../chmod/libs/armeabi/libchmod.so">
 <Link>libs\armeabi\libchmod.so</Link>
 <Abi>armeabi</Abi>
</AndroidNativeLibrary>
<AndroidNativeLibrary Include="..\chmod\libs\armeabi-v7a\libchmod.so">
 <Link>libs\ameabi-v7a\libchmod.so</Link>
 <Abi>armeabi-v7a</Abi>
</AndroidNativeLibrary>

・適当なクラスに宣言を書く

public class Hoge

{

  [DllImport("libchmod.so")]
  public static extern int Chmod(string path, int mode);

}

 

 これでHoge.Chmod("hogehoge", 484);とかで呼び出すとNative側の処理が呼び出される。

 

Visual Studio 2015でAndroid NDKを使った時のメモその1

既存のMakefileをそのまま使う場合

・プロジェクトの新規作成でメイクファイルプロジェクトを選択する。

 

f:id:ai65536:20160430184015p:plain

・作成したソリューションのディレクトリに以前作っていたAndroid.mk,Application.mkをjniディレクトリごとソリューションのディレクトリにコピーする。(この場合はI:\TestProj\Project1\jni"みたいな配置。

・必要なソースファイルもAndroid.mk等の指定から矛盾の内容にコピーする。

 

・ビルドをするとlibs/armeabi/ほげみたいな感じでファイルができる。