2020年9月27日日曜日

JuliaがCやFortranよりも速いと言い出す前に

このエントリーをはてなブックマークに追加
Pocket

ネット界隈で、幾つかのマイクロベンチマークを根拠にJuliaがCやFortranと同等かそれ以上の速度が出ると言う主張を見かけるのだが、比較する前に条件をよく揃えていない事、条件は揃えたが特異なところだけを見ていることがあるので、比較するとき、比較結果を見るときは気をつけて欲しい。

1. 局地的にJuliaが速い場合もあるが、差は小さい

昨日、見かけたのは、モンテカルロ法で円周率を計算するベンチマーク。JuliaとUNIX/Linuxで代表的なCコンパイラgccの生成バイナリの速度を比較して、Juliaがgccの何倍も速い、Juliaがgccに圧勝、gccはダメだと言うような論が主張されていた。色々な意味でダメ比較になっている。

  1. 利用している乱数生成アルゴリズムが異なる。揃えないといけない。
  2. 標本サイズ10⁶だけ比較しており、標本サイズを変えてみていない。
  3. gccがダメと言うのであれば、clangなど他のCコンパイラとgccを比較しないといけない。

上の問題に配慮してベンチマークを取り直してみた*1のだが、標本サイズが10⁴より大きいとJuliaの方が速い一方で、JuliaとCの経過時間の比は一定になっていき、標本サイズに関わらず何倍もJuliaの方が速いというわけではない。10⁷と10⁸では、Juliaの方が8%程度、高速に留まる。また、gccとClang、default_rngとMersenneTwisterを取り代えてベンチマークを取り直したが、パフォーマンスにほとんど差は無かった。

SIMD拡張命令を活かした乱数ライブラリはまとめて計算しておいて、問い合わせに順次出していくような構造をしているのだが、Juliaのライブラリの方がまとめて計算する量が大きそうな挙動である。標本サイズが小さいうちは計算した分を使い切れないので遅くなる一方、標本サイズが大きくなるとパフォーマンスに活かせるようになるが、バッファーサイズの差異による速度差は一次線形なので、標本サイズがとても大きくなると目立たなっているのかも知れない。

2. JuliaがCやFortranよりかない遅いベンチマークは色々とある

以上の結果をもってJuliaはCは同等以上と言えるのではないかと思うかもしれないが、JuliaがCよりかなり遅いベンチマーク結果は山ほどある。あるJulia伝道師がお薦めしていたページにある連分数を用いた数値積分によるC, Fortran, juliaの速度比較を比較してみた*2のだが、経過時間比にして1 : 1.17 : 1.76であった。FortranはJuliaの1.7倍、CはJuliaより1.5倍速い。Juliaで書かれたマクロ経済学のAiyagari (1994)のモデルを解くコードをRとCに移植したものは、高精度版でCがJuliaの2.6倍の速度が出た。McKay, Nakamura and Steinsson (2016)のコードは、RとC++がJuliaの3.7倍の速度であった*3

これらの比較結果から見えてくる傾向があって、構造が単純なアプリケーションだとJuliaとFortran/C/C++との速度差は小さくモノによっては逆転するが、複雑になってくると大きな速度差でFortran/C/C++が勝ることになる。連分数を用いた数値積分のコードは一見、モンテカルロ法で円周率を計算するコードと似たり寄ったりだが、複素数を用いており、ループが入れ籠になっている。単純構造のマイクロベンチマークでJuliaの速度を評価すると、過剰評価になる可能性が高い*4

3. 将来はどうなるか分からない

現時点にあるJuliaとFortran/C/C++の速度差が、今後も維持されるかは分からない。バージョン1.5になるまでに大量にdepreciatedされた関数のことを考えると、今後、もっと果敢な最適化をしてくるかも知れない。掲載から3年ほど経っているらしいJulia伝道師のお薦めページ、載っているコードはそのままは動かなくなっている。実行直前にコンパイルするJuliaの構造から、最適化のレベルが今よりもあがればFortran/C/C++と同等になりそうな気もするし、3重ループから速度が落ちると言うような真偽不明の都市伝説がちらほらと聞こえるのだが、Cのように実行中にメモリアクセス違反が生じても知らんわ・・・と言うようにはいかないのが効く気もする。何はともあれ、現時点では差がある。

4. Fortran/C/C++より遅くても

JuliaはCythonを使わないPythonや、CやRcppを使わないRよりも高速だし、その速度で多様なパッケージを利用できるので、十分、現実的なソリューションとなっている。Cの場合は上述のマイクロベンチマークを書くのに必要だったdSFMTのライブラリも、開発者のページにいってダウンロードしてこないと使えなかったが、Juliaの方はビルトインされていて深いことを考えなくていい。CやFortranよりも速くないと、プログラミング言語としての魅力がJuliaから無くなるかと言うと、そんな事はない。俗にJuliaはCと比較して速度半分と言われているが、高速言語として利用が広がってきている。Fortran/C/C++より遅いという話を、無理に否定しようとしなくても。

0 コメント:

コメントを投稿