はじめに
ZACKYこと山崎進です。また夜中に研究助成申請書を書いています。研究者にとって最重要な仕事の1つですね。
追記: 「ZEAM開発ログ v.0.3.7.1 Linux PC サーバーでGPU駆動ベンチマークを実行してみた」 を書きました! 期待通りの結果が得られました!
SWEST20で3件のポスター発表をしました!
Hastega: Elixirプログラミングにおける超並列化を実現するためのGPGPU活用手法
Nodeプログラミングモデルを活用した C++ および Elixir の実行環境の実装
ポスターデザインはザキ研卒業生のまりまりこと山田麻里衣さんです!
研究構想についても発表しました。
SWEST20でElixir分科会を主催し,micro Elixir / ZEAM 構想を発表しました!
「耐障害性が高くマルチコア性能を最大限発揮できるElixir(エリクサー)を学んでみよう」という分科会を主催しました。
※ 当日は高瀬先生のセッションもありました。高瀬先生の資料も含む全ての講演資料は近日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 (プロセッサ数 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 (プロセッサ数 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 インストーラーからインストールしました。
$ 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)
$ 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)
グレードアップ前:
$ 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) には勝ちましたね。
グレードアップ後:
$ 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言語で書いてみる」です。お楽しみに!
お知らせ:Elixirもくもく会(リモート参加OK、入門トラック有)を9月28日に開催します
「fukuoka.ex#14:Elixir/Phoenixもくもく会~入門もあるよ」を2018年9月28日金曜日に開催します
前回は,ゲリラ的に募った「Zoomによるリモート参加」を,今回から正式に受け付けるようになりましたので,福岡以外の首都圏や地方からでも参加できます(申し込みいただいたら、追ってZoom URLをconnpassメールでお送りします)
また,これまではElixir/Phoenix経験者を対象とした,もくもく会オンリーでしたが,今回から,入門者トラックも併設し,fukuoka.exアドバイザーズ/キャストに質問できるようにアップグレードしました
私,山崎も参加します! さて,何を作ろうかな。。。
お申込みはコチラから
https://fukuokaex.connpass.com/event/100659/