PowerShell for MathNet.NumericsでPowerShellから.NET用の数値計算ライブラリを呼び出せることを知り,Python, Fortran, F#とパフォーマンスを比較してみることにした。
コードはnumerics_testに置いた。
マシン
Pythonや.NETはクロスプラットフォームだし,Fortranもコンパイルし直すだけだが,今回はWindowsで。
- Intel Core i5-6500 @ 3.2 GHz 16GB RAM(自作)
- Windows 10 1803
Python
- Official Python 3.7.1 + pipでインストールしたnumpy。
numpy.show_config()
によるとOpenBLASとリンクされている。 - MKLはcondaに作ったIntel Pythonの仮想環境。Python 3.6.5, Numpy 1.15.4, MKL 2019.2
Pythonのみtimeitモジュールで計測
Fortran
- PGI Community Editon 1810
- Intel Math Kernel Library 2019 update 2
MKLはネットワークインストーラを使用。インストール時に64ビット版のみ,pgiサポートありにカスタマイズ。
pgfortran -mp -Minfo -fast svd -lblas -llapack -o svd
pgfortran -mp -Minfo -fast -o svd_mkl svd.f90 -L"$MKLPATH" mkl_intel_lp64.lib mkl_pgi_thread.lib mkl_core.lib
F
- Visual Studio 2017でインストール。
- .NET Core 2.2 Windows
プロジェクトの作成
プロジェクトを作成し,必要なパッケージを追加する。
パッケージは%USERPROFILE%\.nuget\packages
にインストールされる。
> dotnet new console -lang F# -o fsharp
> cd fsharp
> dotnet add package MathNet.Numerics
> dotnet add package MathNet.Numerics.MKL.Win-x64
コンパイル
dotnet run
では遅かったので,publish
でexe
を作成。
> dotnet publish -c Release -r win-x64
結果
mutmul | eig | svd | inv | det | |
---|---|---|---|---|---|
PowerShell | 3369 | 15602 | 11685 | 10723 | 627 |
PowerShell MKL | 474 | 825 | 486 | 81 | 59 |
Python | 2167 | 12884 | 6609 | 593 | 324 |
Python MKL | 2146 | 7168 | 2814 | 544 | 254 |
Fortran | 1840 | 1468 | 718 | 309 | 126 |
Fortran MKL | 539 | 950 | 583 | 225 | 76 |
F# | 3259 | 14538 | 10810 | 10961 | 616 |
F# MKL | 582 | 960 | 580 | 172 | 142 |
- 10回ずつしか試しておらず,Windowsは他のプロセスも多数動いている点は考慮する必要がある。
- なぜかPowerShell MKLが一番速い。
- OpenBLASのOfficial Pythonはmutmulでは善戦(つまりBLASは速いがLAPACKが遅い。)
- Official BLAS/LAPCKを使っていると思われるPowerShellとF#はとても遅い。
- MKLを使えばF#やPowerShellでもネイティブな速度が出る。.NETのオーバーヘッドは感じられない。
- F#はコードが短くて楽。
- fsi/fsharpiはdllをロードするのが手間(なのでここでは使ってない)。