ZEAM開発ログ v.0.3.6 Mac Pro (Mid 2010) をグレードアップしてGPU駆動ベンチマークを実行してみた

# はじめに

ZACKYこと山崎進です。未明まで徹夜で研究助成申請書を書いていました。これから始発の新幹線に乗って[SWEST](https://swest.toppers.jp)へ移動します。寝てしまうと乗り損ねてしまうので，寝ないようにこの記事を書いています。

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


# fukuoka.ex #13「夏のfukuoka.ex祭＝技術のパラダイムシフト」で登壇しました！

今までのまとめと，micro Elixir / ZEAM の構想のお披露目をしました。

[ZEAM開発ログ第4回〜Pythonを捨ててElixirに移行する日](https://zeam-vm.github.io/zeam-fukuoka.ex-20180824/#/)

[![zeam-fukuoka.ex-20180824.png](https://qiita-image-store.s3.amazonaws.com/0/55223/48414490-23e2-23a6-e595-dad840a65658.png)](https://zeam-vm.github.io/zeam-fukuoka.ex-20180824/#/)

# さて本題

今回は Mac Pro (Mid 2010) のCPUユニットを入手したので，グレードアップしてGPU駆動ベンチマークを実行してみました。


# 使用した機材の仕様

## 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が最強構成になりました。

## 参考: iMac Pro (2017)

* Processor: 2.3 GHz Intel Xeon W (プロセッサ数 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は標準構成です。

# ベンチマーク結果

Elixir 1.7.2 での実行結果です。

## 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|


グレードアップ後:

```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|

* pure Elixir で 1.82〜2.11 倍の速度向上
* Rustler / GPU で 1.40 倍の速度向上
* Rustler / CPU(m) で 1.41 倍の速度向上
* Rust / GPU で 1.72 倍の速度向上
* Rust / CPU(m) で 1.83 倍の速度向上

## 参考: 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|


# おわりに

やはり pure Elixir の方がCPUグレードアップの恩恵は大きかったです！ またCPUだけでなくGPUも速くなっているのが興味深かったです。

というわけで，次回は[「ZEAM開発ログ v.0.3.7 Windows PC サーバーでGPU駆動ベンチマークを実行してみた」](https://qiita.com/zacky1972/items/75282e7579e5aebb3229)をお送りします。お楽しみに！