LoginSignup
5
1

More than 3 years have passed since last update.

Pelemay 0.0.11 で実装したカーネルベンチマーク

Posted at

Pelemay 0.0.11 をリリースしました。

[New feature] Extract calculation kernel
[New feature] mix pelemay.bench and mix pelemay.nerves.bench
[Bug fix] Suppress error logs in case of mix test on Pelemay app

計算カーネルを分離し,mix pelemay.bench および mix pelemay.nerves.bench でカーネルの実行時間を計測して最小二乗法で出力することができます。

x86での実行例

例えば mix new np の後,次のようなコードを書きます。

mix.exs
defmodule Np.MixProject do
  use Mix.Project

  def project do
    [
      app: :np,
      version: "0.1.0",
      elixir: "~> 1.10",
      start_permanent: Mix.env() == :prod,
      deps: deps()
    ]
  end

  # Run "mix help compile.app" to learn about applications.
  def application do
    [
      extra_applications: [:logger]
    ]
  end

  # Run "mix help deps" to learn about dependencies.
  defp deps do
    [
      {:pelemay, "~> 0.0.11"}
    ]
  end
end
lib/np.ex
defmodule Np do
  require Pelemay
  import Pelemay

  defpelemay do
    def map_mult_2(list) do
      list |> Enum.map(& &1 * 2)
    end
  end
end

ここで,mix pelemay.bench Np を実行すると,次のような出力結果が得られます。

[
  [
    function: :map_elem1_mult_2_nif_driver_lsm_double,
    result: [r: 0.9918441034780148, a: 0.2963925671873642, b: 20.96983422139911]
  ],
  [
    function: :map_elem1_mult_2_nif_driver_lsm_i64,
    result: [
      r: 0.9896871109828315,
      a: 0.30485363074644567,
      b: 22.47533563729091
    ]
  ]
]

Clang もしくは x86 アーキテクチャで動作させた時には,$t$ を所用クロック数,$n$ をリスト長とした時に,$t = an + b$ で表されるクロック数かかるということになります。(rは相関係数)

Nerves (target) での動作例

mix nerves.new np とした後,

mix.exs
...
  defp deps do
    [
      # Dependencies for all targets
      ...
      {:pelemay, "~> 0.0.11"},
      ...
    ]
  end
...
lib/np.ex
defmodule Np do
  require Pelemay
  import Pelemay

  defpelemay do
    def map_mult_2(list) do
      list |> Enum.map(& &1 * 2)
    end
  end
end

ここで,mix firmware, mix burn もしくは ./upload.sh とします。

さらに,mix pelemay.nerves.bench Np を実行すると,次のような出力結果が得られます。

[
  [
    function: :map_elem1_mult_2_nif_driver_lsm_double,
    result: [
      r: 0.9999701332269993,
      a: 15.135247668929917,
      b: 296.24489268939215
    ]
  ],
  [
    function: :map_elem1_mult_2_nif_driver_lsm_i64,
    result: [r: 0.9999544021113032, a: 6.791865425419216, b: 296.8161688166135]
  ]
]

GCC かつ Linux かつ x86 アーキテクチャでないプロセッサで動作させた時には,$t$ を所用時間(ns),$n$ をリスト長とした時に,$t = an + b$ で表される時間かかるということになります。(rは相関係数)

バージョン 0.0.10 から 0.0.11 の変更点はこちらです。

取り急ぎ,こんなところで。

5
1
1

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
5
1