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

ZACKYこと山崎進です。

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

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

# こんなコードを書いた

[コードの全体はこちら(GitHub: ブランチ range)](https://github.com/zeam-vm/logistic_map/tree/range) 

lib/logistic_map_Nif.ex (一部)

```elixir
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) グレードアップ後

```bash
$ 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

```bash
$ 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 助言を受けて研究計画について再考する」](https://qiita.com/zacky1972/items/f86480cdff8ea2460d6a)です。お楽しみに！


:stars::stars::stars:<b>　お知らせ：Elixirもくもく会（リモート参加OK、入門トラック有）を**本日**9月28日に開催します　</b>:stars::stars::stars:

[<b>「fukuoka.ex#14：Elixir／Phoenixもくもく会～入門もあるよ」</b>](https://fukuokaex.connpass.com/event/100659/)を**本日**2018年9月28日金曜日に開催します

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

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

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

お申込みはコチラから。いよいよ当日です！
https://fukuokaex.connpass.com/event/100659/
[![image.png](https://qiita-image-store.s3.amazonaws.com/0/155423/3f0fbb56-e5e8-2c4d-7c62-1b0b311d6d02.png)](https://fukuokaex.connpass.com/event/100659/)