はじめに
ZACKYこと山崎進です。
季節外れのアドベントカレンダーは終わりましたが,今後も不定期だが割と頻繁に開発の進捗をレポートしたいと思います。
情報処理学会にて研究発表してきました!
Hastega: Elixirプログラミングにおける超並列化を実現するためのGPGPU活用手法
Nodeプログラミングモデルを活用したC++およびElixirの実行環境の実装
さて本題
今回は 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駆動ベンチマークを実行してみた」をお送りします。お楽しみに。
というわけで...
fukuoka.ex #13 夏のfukuoka.ex祭=技術のパラダイムシフトは,現在,参加者を募集しています! 私も 「Pythonを捨ててElixirに移行する日」というタイトルで発表します!