プログラミング言語 julia の紹介

21
プログラミング言語 2014/9/16 Kentaro Iizuka Github: iizukak の紹介

Upload: kentaro-iizuka

Post on 21-Nov-2014

729 views

Category:

Technology


4 download

DESCRIPTION

プログラミング言語 Julia の簡単な紹介です

TRANSCRIPT

Page 1: プログラミング言語 Julia の紹介

プログラミング言語

2014/9/16 Kentaro Iizuka Github: iizukak

の紹介

Page 2: プログラミング言語 Julia の紹介

• 一言で言えば、科学技術計算向けの高速なLL

• 数値計算 ∪ 確率統計 ∪ 機械学習 ∪ 画像処理 ∪ 等々

Page 3: プログラミング言語 Julia の紹介

ぱっと見、普通なLLfunction  randmatstat(t)                          n  =  5          v  =  zeros(t)                                        w  =  zeros(t)          for  i=1:t                  a  =  randn(n,n)                                    b  =  randn(n,n)                                    c  =  randn(n,n)                                    d  =  randn(n,n)                                    P  =  [a  b  c  d]                                      Q  =  [a  b;  c  d]                                    v[i]  =  trace((P.'*P)^4)                  w[i]  =  trace((Q.'*Q)^4)          end          return  (std(v)/mean(v),  std(w)/mean(w))  end      

function  mandel(z)          c  =  z          maxiter  =  80          for  n  =  1:maxiter                  if  abs(z)  >  2                          return  n-­‐1                  end                  z  =  z^2  +  c          end          return  maxiter  end

Page 4: プログラミング言語 Julia の紹介

もちろん対話環境有

http://docs.julialang.org/en/release-0.3/manual/getting-started/

$  julia                                  _        _              _  _(_)_          |    A  fresh  approach  to  technical  computing      (_)          |  (_)  (_)        |    Documentation:  http://docs.julialang.org        _  _      _|  |_    __  _      |    Type  "help()"  for  help.      |  |  |  |  |  |  |/  _`  |    |      |  |  |_|  |  |  |  (_|  |    |    Version  0.3.0  (2014-­‐08-­‐20  20:43  UTC)    _/  |\__'_|_|_|\__'_|    |    Official  http://julialang.org/  release  |__/                                      |    x86_64-­‐apple-­‐darwin13.3.0      julia>  1  +  2  3      julia>  ans  3  

Page 5: プログラミング言語 Julia の紹介

でいいじゃん?

Page 6: プログラミング言語 Julia の紹介

CPython, R よりは速い

http://julialang.org/benchmarks/

Page 7: プログラミング言語 Julia の紹介

NumPy, PyPy でいいじゃん?

Page 8: プログラミング言語 Julia の紹介

そ、そうかな…?

• 確かにNumPyは速い

• 線形代数関係の使い勝手がよい、と思う

• ユーザー数多い

• だが、NumPyのソースコードを読むのは難易度高

Page 9: プログラミング言語 Julia の紹介

NumPy is 半分 C

Page 10: プログラミング言語 Julia の紹介

• 神によってチューニングされた C

• 使うのは簡単だが、改造/改良は難易度高

• NumPy に限らず、LLで書いて遅いところはCで書きなおすのは定石

NumPy is 半分 C

Page 11: プログラミング言語 Julia の紹介

Julia is だいたい Julia

だいたいJulia どうしてもなところはC

Page 12: プログラミング言語 Julia の紹介

function  randmatstat(t)                          n  =  5          v  =  zeros(t)                                        w  =  zeros(t)          for  i=1:t                  a  =  randn(n,n)                                    b  =  randn(n,n)                                    c  =  randn(n,n)                                    d  =  randn(n,n)                                    P  =  [a  b  c  d]                                      Q  =  [a  b;  c  d]                                    v[i]  =  trace((P.'*P)^4)                  w[i]  =  trace((Q.'*Q)^4)          end          return  (std(v)/mean(v),  std(w)/mean(w))  end      

struct  double_pair  randmatstat(int  t)  {          dsfmt_t  dsfmt;          dsfmt_init_gen_rand(&dsfmt,  1234);              int  n  =  5;          struct  double_pair  r;          double  *v  =  (double*)calloc(t,sizeof(double));          double  *w  =  (double*)calloc(t,sizeof(double));          double  *a  =  (double*)malloc((n)*(n)*sizeof(double));          double  *b  =  (double*)malloc((n)*(n)*sizeof(double));          double  *c  =  (double*)malloc((n)*(n)*sizeof(double));          double  *d  =  (double*)malloc((n)*(n)*sizeof(double));          double  *P  =  (double*)malloc((n)*(4*n)*sizeof(double));          double  *Q  =  (double*)malloc((2*n)*(2*n)*sizeof(double));          double  *PtP1  =  (double*)malloc((4*n)*(4*n)*sizeof(double));          double  *PtP2  =  (double*)malloc((4*n)*(4*n)*sizeof(double));          double  *QtQ1  =  (double*)malloc((2*n)*(2*n)*sizeof(double));          double  *QtQ2  =  (double*)malloc((2*n)*(2*n)*sizeof(double));          for  (int  i=0;  i  <  t;  i++)  {                  randmtzig_fill_randn(&dsfmt,  a,  n*n);                  randmtzig_fill_randn(&dsfmt,  b,  n*n);                  randmtzig_fill_randn(&dsfmt,  c,  n*n);                  randmtzig_fill_randn(&dsfmt,  d,  n*n);                  memcpy(P+0*n*n,  a,  n*n*sizeof(double));                  memcpy(P+1*n*n,  b,  n*n*sizeof(double));                  memcpy(P+2*n*n,  c,  n*n*sizeof(double));                  memcpy(P+3*n*n,  d,  n*n*sizeof(double));                  for  (int  j=0;  j  <  n;  j++)  {                          for  (int  k=0;  k  <  n;  k++)  {                                  Q[2*n*j+k]              =  a[k];                                  Q[2*n*j+n+k]          =  b[k];                                  Q[2*n*(n+j)+k]      =  c[k];                                  Q[2*n*(n+j)+n+k]  =  d[k];                          }                        }                        cblas_dgemm(CblasColMajor,  CblasTrans,  CblasNoTrans,                                          n,  n,  4*n,  1.0,  P,  4*n,  P,  4*n,  0.0,  PtP1,  4*n);                  cblas_dgemm(CblasColMajor,  CblasNoTrans,  CblasNoTrans,                                          4*n,  4*n,  4*n,  1.0,  PtP1,  4*n,  PtP1,  4*n,  0.0,  PtP2,  4*n);                  cblas_dgemm(CblasColMajor,  CblasNoTrans,  CblasNoTrans,                                          4*n,  4*n,  4*n,  1.0,  PtP2,  4*n,  PtP2,  4*n,  0.0,  PtP1,  4*n);                  for  (int  j=0;  j  <  n;  j++)  {                          v[i]  +=  PtP1[(n+1)*j];                  }                        cblas_dgemm(CblasColMajor,  CblasTrans,  CblasNoTrans,                                          2*n,  2*n,  2*n,  1.0,  Q,  2*n,  Q,  2*n,  0.0,  QtQ1,  2*n);                  cblas_dgemm(CblasColMajor,  CblasNoTrans,  CblasNoTrans,                                          2*n,  2*n,  2*n,  1.0,  QtQ1,  2*n,  QtQ1,  2*n,  0.0,  QtQ2,  2*n);  

C

Julia

Page 13: プログラミング言語 Julia の紹介

Julia プログラマは Julia 本体のコードが読める

Page 14: プログラミング言語 Julia の紹介

低レイヤ層マンにも優しい

julia> f(x) = x * x!f (generic function with 1 method)!!julia> f(2.0)!4.0!!julia> code_llvm(f, (Float64,))!!define double @julia_f662(double) {!top:! %1 = fmul double %0, %0, !dbg !3553! ret double %1, !dbg !3553!}!

出力される LLVM コードの チェックも楽

Page 15: プログラミング言語 Julia の紹介

Julia では、ドメインエキスパートと 速度マニアが一緒に仕事ができる。 これは大きな達成である。

Why I’m Betting on Julia By Evan Miller http://www.evanmiller.org/why-im-betting-on-julia.html

Page 16: プログラミング言語 Julia の紹介

絶賛開発中

• 0.1 : 2013/02

• 0.2 : 2013/11

• 0.3 : 2014/08

• JuliaCon 2014 : 2014/06

Page 17: プログラミング言語 Julia の紹介

ドキュメントしっかりしてる

http://julia.readthedocs.org/en/latest/

Page 18: プログラミング言語 Julia の紹介

コミュニティが活発

MLへの投稿多し(in 12 hour)

Page 19: プログラミング言語 Julia の紹介

More Features• 多重ディスパッチ

• 同図像性(マクロがあります)

• C の呼び出しも簡単(ええ、C も使えますよもちろん)

• 使いやすい並列計算の仕組み

• パッケージ管理ももちろんあります

• MIT License

Page 20: プログラミング言語 Julia の紹介

• 科学技術計算向けの速いLL

• OO な LL を書いたことがある人なら簡単

• Julia の大部分は Julia で書かれている

• 科学好きプログラマにぴったり!

Page 21: プログラミング言語 Julia の紹介

おまけ• インストール

• OS X なら dmg を落とすだけ! 最新版を使う

• http://julialang.org/downloads/

• チュートリアル

• http://julia.readthedocs.org/en/latest/manual/getting-started/

• ドキュメント

• http://docs.julialang.org/en/latest/

• JuliaCon 2014 の発表動画

• https://www.youtube.com/user/JuliaLanguage