LoginSignup
5
5

More than 5 years have passed since last update.

PowerShellで行列計算

Posted at

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

Fortran

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では遅かったので,publishexeを作成。

> 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をロードするのが手間(なのでここでは使ってない)。
5
5
0

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
5