ZEAM開発ログ v.0.3.7 Windows PC サーバーでGPU駆動ベンチマークを実行してみた

# はじめに

ZACKYこと山崎進です。また夜中に研究助成申請書を書いています。研究者にとって最重要な仕事の1つですね。

[「ZEAM開発ログ 目次」はこちら](https://qiita.com/zacky1972/items/70593ab2b70d192813df)

**追記:** [「ZEAM開発ログ v.0.3.7.1 Linux PC サーバーでGPU駆動ベンチマークを実行してみた」](https://qiita.com/zacky1972/items/538982f275b9d4c03ae2) を書きました！ 期待通りの結果が得られました！

# SWEST20で3件のポスター発表をしました！

[fukuoka.ex 福岡 Elixir コミュニティ](https://zeam-vm.github.io/papers/SWEST_fukuoka_ex-2.pdf)

[![SWEST_fukuoka_ex-2.jpg](https://qiita-image-store.s3.amazonaws.com/0/55223/1bb14367-0020-ae34-6ffb-eab6c2c92501.jpeg)](https://zeam-vm.github.io/papers/SWEST_fukuoka_ex-2.pdf)

[Hastega: Elixirプログラミングにおける超並列化を実現するためのGPGPU活用手法](https://zeam-vm.github.io/papers/SWEST_Hastega.pdf)

[![SWEST_Hastega.jpg](https://qiita-image-store.s3.amazonaws.com/0/55223/0aaf90e9-c363-7baf-ad10-9fe103fd44b5.jpeg)](https://zeam-vm.github.io/papers/SWEST_Hastega.pdf)

[Nodeプログラミングモデルを活用した C++ および Elixir の実行環境の実装](https://zeam-vm.github.io/papers/SWEST_Node.pdf)

[![SWEST_Node.jpg](https://qiita-image-store.s3.amazonaws.com/0/55223/2079048d-af75-c5d7-a44f-7c40fd49517e.jpeg)](https://zeam-vm.github.io/papers/SWEST_Node.pdf)

[ポスターデザインはザキ研卒業生のまりまりこと山田麻里衣さんです！](https://twitter.com/YamadaQuality/)

研究構想についても発表しました。

![Elixir-proposal-2018.png](https://qiita-image-store.s3.amazonaws.com/0/55223/1d254ade-2a12-d9da-ef7b-336c34405126.png)


# SWEST20でElixir分科会を主催し，micro Elixir / ZEAM 構想を発表しました！

[「耐障害性が高くマルチコア性能を最大限発揮できるElixir(エリクサー)を学んでみよう」](https://swest.toppers.jp/SWEST20/program/s2c.html#s2)という分科会を主催しました。

[![zeam-SWEST-2018-pr.png](https://qiita-image-store.s3.amazonaws.com/0/55223/010d2636-7704-a0be-b34b-2f2adc3a1a8c.png)](https://zeam-vm.github.io/zeam-SWEST-2018-pr/#/)

※ 当日は高瀬先生のセッションもありました。高瀬先生の資料も含む全ての講演資料は近日SWESTホームページで公開予定です。


# さて本題

ありがたいことに FAIS から研究助成をいただき，前回の Mac Pro (Mid 2010) 用のCPUユニットに加えて，Intel Xeon x2 + NVIDIA GeForce GTX 1080 Ti のユニットコム製GPGPUサーバーも購入できました。今回は，このマシンで Windows 10 のセットアップをしてGPU駆動ベンチマークを実行してみました。

# 使用した機材の仕様

## GPGPUサーバー ユニットコム UCGPU-E2630V4-32GB

* Processor: [2.20GHz Intel Xeon E5-2630 v4](https://ark.intel.com/ja/products/92981/Intel-Xeon-Processor-E5-2630-v4-25M-Cache-2_20-GHz) (プロセッサ数 2 物理コア数 10コア x 2，論理コア数 20コア x 2)
* Memory: 32 GB 2400 MHz DDR4
* Graphics: NVIDIA GeForce GTX 1080 Ti
* OS
  * Windows 10 Pro

iMac Pro に迫るスペックです。コア数は本GPGPUサーバーの方が多く，クロックはiMac Proの方が若干高い，世代はiMac Proの方が1つ新しい，という感じです。グラフィックボードは iMac Pro 搭載の Radeon Pro Vega 64 よりも GPGPUサーバー搭載の NVIDIA GeForce GTX 1080 Ti の方が処理能力が高いと言われています。

予想としては pure Elixir だとコア数の多いGPGPUサーバーの方が有利で，ネイティブコードが入ると iMac Pro の方が有利，GPU駆動はGPGPUサーバーが優勢と見ましたが，果たして結果はいかに？

## 参考: iMac Pro (2017)

* Processor: [2.3 GHz Intel Xeon W](https://ark.intel.com/JA/products/126793/Intel-Xeon-W-2195-Processor-24_75M-Cache-2_30-GHz) (プロセッサ数 1，物理コア18，論理コア36)
* Memory: 32 GB 2666 MHz DDR4
* Graphics: Radeon Pro Vega 64 16368MB
* SSD (BlackMagic)
    * Write 2980.3MB/s
    * Read 2465.1MB/s

CPUとGPUは最高性能の構成，メモリとSSDは標準構成です。

## 参考: Mac Pro (Mid 2010)

* Processor: 
  * グレードアップ前: 2.8 GHz Quad-Core Intel Xeon (プロセッサ数 1，物理コア数 4，論理コア数8)
  * グレードアップ後: 2 x 3.46 GHz 6-Core Intel Xeon (プロセッサ数 2，物理コア数 6 x 2，論理コア数 12 x 2)
* Memory: 16 GB 1066 MHz DDR3
* Graphics: ATI Radeon HD 5770 1024MB
* SSD (BlackMagic)
    * Write 473.9MB/s
    * Read 507.4MB/s

CPUが最強構成になりました。


# ベンチマーク結果

Elixir 1.7.2 での実行結果です。

## GPGPUサーバー ユニットコム UCGPU-E2630V4-32GB

Elixir は Windows インストーラーからインストールしました。

```bash
$ elixir -v
Erlang/OTP 21 [erts-10.0.1] [64-bit] [smp:40:32] [ds:40:32:10] [async-threads:1]

Elixir 1.7.3 (compiled with Erlang/OTP 19)
```

Erlang/OTP 19 とかなっているのが気になりますね。あと，HiPE (High Performance Erlang) が有効になっていないようにも見えます。一抹の不安。。。

|stages|benchmarks1|benchmarks3|benchmarks8|
|-----:|----------:|----------:|----------:|
|      |pure Elixir|pure Elixir|Elixir/Rustler|
|      |loop       |inlining inside of Flow.map|loop, passing by list, with Window|
|     1|42.188|29.703| 7.922|
|     2|20.875|21.938|24.047|
|     4|11.500|10.750|16.797|
|     8| 8.891| 8.421|19.187|
|    16| 8.578|12.110|21.938|
|    32| 9.156| 8.453|21.562|
|    64|13.328| 9.156|23.219|
|   128| 9.875|12.969|26.187|

|benchmarks_g2|benchmarks_t1|benchmarks_empty|
|---------:|--------:|-----:|
|Elixir/Rustler|Elixir/Rustler|Elixir/Rustler|
|OpenCL(GPU), inlining|rayon|Ruslter empty|
|2.109|1.625|1.531|

|Rust CPU|Rust OpenCL|Rust rayon|
|----------:|-----:|-----:|
|Rust|Rust|Rust|
|CPU(1), loop|OpenCL(GPU), inlining|CPU(multi), loop|
|1.859367|1.343743|0.453128|

なんか，思ったより速くないですね。HiPE が効いていないせいかもしれませんが，Rust でもそれほど速くなっていないので，HiPEのせいばかりとは言えなさそうです。

pure Elixir で benchmark1 と benchmark3 で stages 1 の時に大きく差がついているのが特徴的です。インライン展開が有効ということでしょうか。

## 参考: iMac Pro (2017)

```bash
$ elixir -v
Erlang/OTP 21 [erts-10.0] [source] [64-bit] [smp:36:36] [ds:36:36:10] [async-threads:1] [hipe] [sharing-preserving]

Elixir 1.7.2 (compiled with Erlang/OTP 21)
```

|stages|benchmarks1|benchmarks3|benchmarks8|
|-----:|----------:|----------:|----------:|
|      |pure Elixir|pure Elixir|Elixir/Rustler|
|      |loop       |inlining inside of Flow.map|loop, passing by list, with Window|
|     1|22.823357|17.263715| 4.577052|
|     2|11.232475| 8.647210|13.938190|
|     4| 5.954148| 5.409378|10.471390|
|     8| 3.954989| 4.129163| 9.647276|
|    16| 4.225692| 4.130425|10.081226|
|    32| 4.311388| 3.965232|11.729024|
|    64| 4.157024| 3.902033|15.635729|
|   128| 4.008359| 4.323282|23.133601|

|benchmarks_g2|benchmarks_t1|benchmarks_empty|
|---------:|--------:|-----:|
|Elixir/Rustler|Elixir/Rustler|Elixir/Rustler|
|OpenCL(GPU), inlining|rayon|Ruslter empty|
|1.23860|0.67441|0.81719|

|Rust CPU|Rust OpenCL|Rust rayon|
|----------:|-----:|-----:|
|Rust|Rust|Rust|
|CPU(1), loop|OpenCL(GPU), inlining|CPU(multi), loop|
|1.212508|0.707200|0.251875|

iMac Pro の速度には大差をつけられていますね。

## 参考: Mac Pro (Mid 2010)

グレードアップ前:

```bash
$ elixir -v
Erlang/OTP 21 [erts-10.0] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [hipe]

Elixir 1.7.2 (compiled with Erlang/OTP 21)
```

|stages|benchmarks1|benchmarks3|benchmarks8|
|-----:|----------:|----------:|----------:|
|      |pure Elixir|pure Elixir|Elixir/Rustler|
|      |loop       |inlining inside of Flow.map|loop, passing by list, with Window|
|     1|47.653314|37.392453| 7.726425|
|     2|23.946650|19.162682|25.177824|
|     4|13.690849|12.417391|19.870013|
|     8|12.361272|13.123296|18.489603|
|    16|12.178206|11.210884|19.965729|
|    32|12.540539|10.591330|22.487094|
|    64|12.470190|10.878797|28.189323|
|   128|12.262785|11.103630|38.555434|

|benchmarks_g2|benchmarks_t1|benchmarks_empty|
|---------:|--------:|-----:|
|Elixir/Rustler|Elixir/Rustler|Elixir/Rustler|
|OpenCL(GPU), inlining|rayon|Ruslter empty|
|2.423294|1.784261|1.313502|

|Rust CPU|Rust OpenCL|Rust rayon|
|----------:|-----:|-----:|
|Rust|Rust|Rust|
|CPU(1), loop|OpenCL(GPU), inlining|CPU(multi), loop|
|2.926270|1.545693|0.669060|

さすがにグレードアップ前の Mac Pro (Mid 2010) には勝ちましたね。

グレードアップ後:

```bash
$ elixir -v
Erlang/OTP 21 [erts-10.0] [source] [64-bit] [smp:24:24] [ds:24:24:10] [async-threads:1] [hipe]

Elixir 1.7.2 (compiled with Erlang/OTP 21)
```

|stages|benchmarks1|benchmarks3|benchmarks8|
|-----:|----------:|----------:|----------:|
|      |pure Elixir|pure Elixir|Elixir/Rustler|
|      |loop       |inlining inside of Flow.map|loop, passing by list, with Window|
|     1|40.904522|32.825059| 6.467740|
|     2|18.963229|16.029738|22.610193|
|     4|10.753609| 9.113769|17.479965|
|     8| 6.362842| 6.490303|18.599809|
|    16| 5.778699| 5.820455|17.680624|
|    32| 6.820108| 6.515120|19.793970|
|    64| 7.082667| 6.924904|26.567416|
|   128| 7.124302| 7.131452|39.737620|

|benchmarks_g2|benchmarks_t1|benchmarks_empty|
|---------:|--------:|-----:|
|Elixir/Rustler|Elixir/Rustler|Elixir/Rustler|
|OpenCL(GPU), inlining|rayon|Ruslter empty|
|1.733477|1.267730|1.842386|

|Rust CPU|Rust OpenCL|Rust rayon|
|----------:|-----:|-----:|
|Rust|Rust|Rust|
|CPU(1), loop|OpenCL(GPU), inlining|CPU(multi), loop|
|2.456480|0.900843|0.365043|


しかしグレードアップ後の Mac Pro (Mid 2010) には負けています。なぜだろう？

# 考察

最初は設置場所の関係で気温が高かったせいかと思ったのですが，冷房を効かせてみて実験してもそう大差なかったので，気温のせいとは言えないような気がします。もっと涼しくなったら確かめられますね。

次に HiPE が無効になっている説が考えられますが，Elixir や Elixir / Rustler の実行だけでなく，Rust での実行も速くなっていないので，このせいばかりとは言えません。しかしながら，この説が成立しているか見極めるには，Elixir / Erlang をソースコードビルドして確かめる必要があります。もし HiPE が無効になっているとしたら，Elixir の Windows インストーラーは HiPE が無効になっているということなので，これはちょっとした一大事です。

次に考えられるのは，ハードウェア的に何かしらのボトルネックがあるのか，あるいは macOS と Windows の違いということが考えられます。どちらなのかを見極めるためには，GPGPU サーバーに Linux をインストールして試してみたり，iMac Pro / Mac Pro に Windows や Linux をインストールして試してみたり，というのが要りますね。

いずれにせよ，すぐにできる状態ではなかったので，今後追試してみたいと思います。

# おわりに

GPGPUサーバーが期待した性能を発揮できなかったのが残念です。今後も実験を継続し，何が原因なのかを特定したいと思います。

ちなみに，Windows マシンであっても，GPU駆動ベンチマークのインストールはとても楽勝でした！ 私たちが開発した Hastega の優位性と言えます。これが Python / CUDA だと環境構築に一苦労ですからね。

次回は新シリーズで[「ZEAM開発ログ v.0.4.0 型多相かつ型安全なNIFをC言語で書いてみる」](https://qiita.com/zacky1972/items/ddcbab5998d7864b3f18)です。お楽しみに！

:stars::stars::stars:<b>　お知らせ：Elixirもくもく会（リモート参加OK、入門トラック有）を9月28日に開催します　</b>:stars::stars::stars:

[<b>「fukuoka.ex#14：Elixir／Phoenixもくもく会～入門もあるよ」</b>](https://fukuokaex.connpass.com/event/100659/)を2018年9月28日金曜日に開催します

前回は，ゲリラ的に募った「Zoomによるリモート参加」を，今回から正式に受け付けるようになりましたので，福岡以外の首都圏や地方からでも参加できます（申し込みいただいたら、追ってZoom URLをconnpassメールでお送りします）

また，これまではElixir／Phoenix経験者を対象とした，もくもく会オンリーでしたが，今回から，入門者トラックも併設し，fukuoka.exアドバイザーズ／キャストに質問できるようにアップグレードしました

私，山崎も参加します！ さて，何を作ろうかな。。。

お申込みはコチラから
https://fukuokaex.connpass.com/event/100659/
[![image.png](https://qiita-image-store.s3.amazonaws.com/0/155423/3f0fbb56-e5e8-2c4d-7c62-1b0b311d6d02.png)](https://fukuokaex.connpass.com/event/100659/)