LoginSignup
4
1

More than 5 years have passed since last update.

ZEAM開発ログ v.0.4.8 INT64判定をGPUベンチマークに組込む

Last updated at Posted at 2018-09-28

ZACKYこと山崎進です。

INT64判定をせっかく作ったので,自作のGPUベンチマークに組込んでみました。

「ZEAM開発ログ 目次」はこちら

こんなコードを書いた

コードの全体はこちら(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 助言を受けて研究計画について再考する」です。お楽しみに!

:stars::stars::stars: お知らせ:Elixirもくもく会(リモート参加OK、入門トラック有)を本日9月28日に開催します :stars::stars::stars:

「fukuoka.ex#14:Elixir/Phoenixもくもく会~入門もあるよ」本日2018年9月28日金曜日に開催します

前回は,ゲリラ的に募った「Zoomによるリモート参加」を,今回から正式に受け付けるようになりましたので,福岡以外の首都圏や地方からでも参加できます(申し込みいただいたら、追ってZoom URLをconnpassメールでお送りします)

また,これまではElixir/Phoenix経験者を対象とした,もくもく会オンリーでしたが,今回から,入門者トラックも併設し,fukuoka.exアドバイザーズ/キャストに質問できるようにアップグレードしました

私,山崎も参加します! この記事の延長線上のものを作ろうと思っています。

お申込みはコチラから。いよいよ当日です!
https://fukuokaex.connpass.com/event/100659/
image.png

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1