数値計算
Julia
高速化

Julia を使って計算の高速化

経緯

これまで Python で小規模な数値計算をやってきたが、

  • 高速らしい
  • 可視化も良さそう

なので Julia を試してみる

インストール

JuliaPro (ディストリビューション)
https://juliacomputing.com/products/juliapro.html
Personal は無料、要ユーザー登録

インストール後、 anaconda の Jupyter notebook を起動すると Julia のカーネルが利用できるようになっている

REPL
Pkg.update()     # けっこうかかる
Pkg.add("Plots") # 可視化、フロントエンド
Pkg.add("GR")    # 可視化、バックエンド

基本的なこと

  • (コンマかセミコロンで区切った)一次元配列は縦ベクトル
  • 1-origin
  • 配列入力に対してはドット(自動的にブロードキャストされる) sin.( [1, 3, 7] )

Julia言語で計算が遅くなった場合の解決法
http://nbviewer.jupyter.org/gist/genkuroki/1ac59bb3e03eac12945d7040d4f98246

引数渡しの挙動

  • 配列はポインタ(参照?)渡し
  • 引数が変更される関数には!をつける

実は NumPy でも同じだが、これまで気づいていなかった

# 数字
function f(x)   # コピーが渡される
    x += 100   # コピーに変更を加える
end

x = 1
f(x)
x               # 1 呼び出し元は変更されない

# 配列
function g!(arr)    # アドレス(のコピー?)が渡される
    arr[:] += 100  # 呼び出し元に変更を加える
end

arr = [1]
g!(arr)
arr                     # [101] 呼び出し元が変更されている

関数は遅延評価

これも Python と同じ(だが、以下略)

a = 1
return_a() = a    # 関数の短い書き方

a = 2
return_a()        # 2

様々な実装と処理時間

KdV 方程式 t=1.2 まで計算
Walkley Scheme, Δt = 1e-5
kdv.png

言語 処理時間 倍率 詳細
Python 19 sec 1.0x NumPy convolve1
Julia 50 sec 0.4x デフォルトの conv
Julia 7.0 sec 2.7x FastConv2
Julia 5.6 sec 3.4x FastConv + 関数化
Julia 2.9 sec 6.6x FastConv + 関数化 + 型指定 
Julia 3.1 sec 6.1x ベクトルの内積
Julia 230 ms 82x for文
Julia 92 ms 206x for文 + SIMD