ZACKYこと山崎進です。
INT64判定をせっかく作ったので,自作のGPUベンチマークに組込んでみました。
こんなコードを書いた
コードの全体はこちら(GitHub: ブランチ range)
lib/logistic_map_Nif.ex (一部)
defmodule LogisticMapNif do
use Rustler, otp_app: :logistic_map, crate: :logistic_map
require Asm
import Asm
# When your NIF is loaded, it will override this function.
def init_nif(), do: :erlang.nif_error(:nif_not_loaded)
def call_ocl(_x, p, mu) when is_int64(p) and is_int64(mu), do: :erlang.nif_error(:nif_not_loaded)
def call_ocl2(_x, p, mu) when is_int64(p) and is_int64(mu), do: :erlang.nif_error(:nif_not_loaded)
def call_empty(_x, p, mu) when is_int64(p) and is_int64(mu), do: :erlang.nif_error(:nif_not_loaded)
def calc(_x, p, mu) when is_int64(p) and is_int64(mu), do: :erlang.nif_error(:nif_not_loaded)
def map_calc_list(_list, num, p, mu) when is_int64(num) and is_int64(p) and is_int64(mu), do: :erlang.nif_error(:nif_not_loaded)
def to_binary(_list), do:
:erlang.nif_error(:nif_not_loaded)
def map_calc_binary(_binary, num, p, mu) when is_int64(num) and is_int64(p) and is_int64(mu), do:
:erlang.nif_error(:nif_not_loaded)
def map_calc_t1(_list, num, p, mu) when is_int64(num) and is_int64(p) and is_int64(mu), do:
:erlang.nif_error(:nif_not_loaded)
...
end
リストの要素が INT64 かの判定はそれはそれで要りますね。あとで実装を考えよう。
使用した機材の仕様
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は標準構成です。
ベンチマーク結果
誤差の範囲みたいです。
Mac Pro (Mid 2010) グレードアップ後
$ elixir -v
Erlang/OTP 21 [erts-10.1] [source] [64-bit] [smp:24:24] [ds:24:24:10] [async-threads:1] [hipe] [sharing-preserving]
Elixir 1.7.3 (compiled with Erlang/OTP 21)
INT64判定なし
stages | benchmarks1 | benchmarks3 | benchmarks8 |
---|---|---|---|
pure Elixir | pure Elixir | Elixir/Rustler | |
loop | inlining inside of Flow.map | loop, passing by list, with Window | |
1 | 39.011949 | 31.346092 | 6.503395 |
2 | 19.469314 | 16.924067 | 22.090617 |
4 | 11.514909 | 9.525114 | 20.535796 |
8 | 6.796793 | 6.802147 | 18.993757 |
16 | 6.095281 | 6.455539 | 22.036004 |
32 | 7.298622 | 6.905730 | 28.436841 |
64 | 7.505238 | 8.845649 | 36.222197 |
128 | 8.031579 | 7.513903 | 50.668755 |
benchmarks_g2 | benchmarks_t1 | benchmarks_empty |
---|---|---|
Elixir/Rustler | Elixir/Rustler | Elixir/Rustler |
OpenCL(GPU), inlining | rayon | Ruslter empty |
1.461818 | 1.062061 | 1.910971 |
INT64判定あり
stages | benchmarks1 | benchmarks3 | benchmarks8 |
---|---|---|---|
pure Elixir | pure Elixir | Elixir/Rustler | |
loop | inlining inside of Flow.map | loop, passing by list, with Window | |
1 | 38.917572 | 31.239018 | 6.494845 |
2 | 19.393174 | 16.961465 | 24.924447 |
4 | 11.407064 | 9.539546 | 21.095470 |
8 | 6.688697 | 6.853216 | 19.004524 |
16 | 6.131300 | 6.378301 | 22.143169 |
32 | 7.132144 | 6.755734 | 29.062707 |
64 | 7.465966 | 9.032967 | 36.798732 |
128 | 7.672280 | 7.474034 | 50.207617 |
benchmarks_g2 | benchmarks_t1 | benchmarks_empty |
---|---|---|
Elixir/Rustler | Elixir/Rustler | Elixir/Rustler |
OpenCL(GPU), inlining | rayon | Ruslter empty |
1.484173 | 1.089455 | 1.905256 |
iMac Pro
$ elixir -v
Erlang/OTP 21 [erts-10.1] [source] [64-bit] [smp:36:36] [ds:36:36:10] [async-threads:1] [hipe] [sharing-preserving]
Elixir 1.7.3 (compiled with Erlang/OTP 21)
INT64判定なし
stages | benchmarks1 | benchmarks3 | benchmarks8 |
---|---|---|---|
pure Elixir | pure Elixir | Elixir/Rustler | |
loop | inlining inside of Flow.map | loop, passing by list, with Window | |
1 | 21.033513 | 15.654577 | 4.719998 |
2 | 10.762707 | 8.696392 | 14.506782 |
4 | 6.618616 | 5.276284 | 11.852808 |
8 | 4.278081 | 4.161237 | 10.860643 |
16 | 3.847791 | 3.808879 | 12.100916 |
32 | 4.421939 | 3.944659 | 15.628758 |
64 | 4.578716 | 5.197287 | 20.084172 |
128 | 4.555781 | 4.411070 | 28.867467 |
benchmarks_g2 | benchmarks_t1 | benchmarks_empty |
---|---|---|
Elixir/Rustler | Elixir/Rustler | Elixir/Rustler |
OpenCL(GPU), inlining | rayon | Ruslter empty |
1.043664 | 0.868919 | 1.194835 |
INT64判定あり
stages | benchmarks1 | benchmarks3 | benchmarks8 |
---|---|---|---|
pure Elixir | pure Elixir | Elixir/Rustler | |
loop | inlining inside of Flow.map | loop, passing by list, with Window | |
1 | 20.560353 | 15.633272 | 4.615349 |
2 | 10.936360 | 8.836433 | 15.333913 |
4 | 6.192533 | 5.520968 | 11.213617 |
8 | 3.955429 | 4.440325 | 10.882564 |
16 | 4.349171 | 4.273822 | 12.157997 |
32 | 4.465429 | 4.089763 | 14.664140 |
64 | 4.685076 | 4.069384 | 20.075830 |
128 | 4.175054 | 4.442996 | 28.437392 |
benchmarks_g2 | benchmarks_t1 | benchmarks_empty |
---|---|---|
Elixir/Rustler | Elixir/Rustler | Elixir/Rustler |
OpenCL(GPU), inlining | rayon | Ruslter empty |
1.229529 | 0.686809 | 0.861733 |
次回は「ZEAM開発ログ v.0.4.9 助言を受けて研究計画について再考する」です。お楽しみに!
お知らせ: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/