ZEAM開発ログ v.0.3.4 iMac Pro でGPU駆動ベンチマークを実行してみた

# はじめに

ZACKYこと山崎進です。

季節外れのアドベントカレンダーは終わりましたが，今後も不定期だが割と頻繁に開発の進捗をレポートしたいと思います。


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

情報処理学会にて研究発表してきました！

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

[![GPU-SWoPP-2018.png](https://qiita-image-store.s3.amazonaws.com/0/55223/22360297-373c-5992-5077-4a96e28a432d.png)](https://zeam-vm.github.io/GPU-SWoPP-2018-pr/#/)

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

[![LCB-SWoPP-2018.png](https://qiita-image-store.s3.amazonaws.com/0/55223/84ea03a7-d0ec-6500-8075-1cf25f9cbf41.png)](https://zeam-vm.github.io/LCB-SWoPP-2018-pr/#/)

# さて本題

今回は iMac Pro (2017) を入手できたので，さっそくロジスティック写像のGPU駆動ベンチマークを走らせてみました。 Elixir と Rust です。

# 使用した機材の仕様

## Mac Pro (Mid 2010)

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

近日中にアップグレードする予定です。

## 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は標準構成です。

# ベンチマーク結果

## Mac Pro (Mid 2010)

|stages|benchmarks1|benchmarks3|benchmarks8|
|-----:|----------:|----------:|----------:|
|      |pure Elixir|pure Elixir|Elixir/Rustler|
|      |loop       |inlining inside of Flow.map|loop, passing by list, with Window|
|     1|47.904713|36.558484|7.690833|
|     2|22.640058|19.067411|24.836797|
|     4|13.701835|12.308965|22.318805|
|     8|12.149914|13.063872|19.550625|
|    16|12.252772|11.196587|21.662009|
|    32|12.407663|10.578510|23.749637|
|    64|12.273788|10.784512|29.402247|
|   128|12.177492|11.052482|38.949820|

|benchmarks_g2|benchmarks_t1|benchmarks_empty|
|---------:|--------:|-----:|
|Elixir/Rustler|Elixir/Rustler|Elixir/Rustler|
|OpenCL(GPU), inlining|rayon|Ruslter empty|
|2.388171|1.748167|1.859177|

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

## iMac Pro (2017)

|stages|benchmarks1|benchmarks3|benchmarks8|
|-----:|----------:|----------:|----------:|
|      |pure Elixir|pure Elixir|Elixir/Rustler|
|      |loop       |inlining inside of Flow.map|loop, passing by list, with Window|
|     1|23.293633|16.314111| 4.488194|
|     2|10.597676| 8.448215|13.365214|
|     4| 6.167245| 5.166398|11.185324|
|     8| 3.822116| 3.946276| 9.242530|
|    16| 3.485068| 3.630794| 9.967291|
|    32| 3.996512| 3.710175|12.547183|
|    64| 4.126338| 4.812670|15.366454|
|   128| 4.066535| 4.098808|22.587284|

|benchmarks_g2|benchmarks_t1|benchmarks_empty|
|---------:|--------:|-----:|
|Elixir/Rustler|Elixir/Rustler|Elixir/Rustler|
|OpenCL(GPU), inlining|rayon|Ruslter empty|
|0.931936|0.642010|1.075443|

|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 は最もナイーブなbenchmarks1の最速で4秒切っちゃうんだから，ものすごいスピードです。最も速いRust rayon は0.25秒台ということで，凄まじ過ぎます。


# 比較考察

|             |       |       |Mac Pro / iMac Pro| 
|:------------|:------|:------|-----------------:|
|benchmarks1  |Elixir | CPU(m)|3.486             |
|benchmarks3  |Elixir | CPU(m)|3.084             |
|benchmarks8  |Rustler| CPU(1)|1.714             |
|benchmarks_g2|Rustler| GPU   |2.563             |
|benchmarks_t1|Rustler| CPU(m)|2.723             |
|empty        |Rustler|       |1.729             |
|Rust CPU     |Rust   | CPU(1)|2.412             |
|Rust OpenCL  |Rust   | GPU   |2.186             |
|Rust rayon   |Rust   | CPU(m)|2.656             |

速度向上の恩恵は，Rust よりも Elixirの方が大きいようです。Elixir の方がコア数が増えた時に伸びるということなので，Elixir の方が並列処理でかかる同期・通信や排他制御のオーバーヘッドが少ないのだろうと考えられます。

# おわりに

研究費で iMac Pro を購入させていただいたので，これまで以上に Elixir の開発に邁進したいと思います！

次回ですが，[「Elixir 1.7.2 でGPU駆動ベンチマークを実行してみた」](https://qiita.com/zacky1972/items/c238cb88c7f95a9118df)をお送りします。お楽しみに。

というわけで...

[![fukuoka_ex.png](https://qiita-image-store.s3.amazonaws.com/0/55223/7b8e1994-fc90-8f73-54aa-a3108e05b3e5.png)](https://fukuokaex.connpass.com/event/89472/)

[fukuoka.ex #13　夏のfukuoka.ex祭＝技術のパラダイムシフト](https://fukuokaex.connpass.com/event/89472/)は，現在，参加者を募集しています！ 私も 「Pythonを捨ててElixirに移行する日」というタイトルで発表します！