CPU Bound な並列計算をする際に,WSL2とWSL1とで性能差が出るのか気になったので調べた.結果,WSL2が多少有利な場合もあるかも…?
電磁波の伝搬を数値シミュレーションしたいですよね?(真顔) FDTDという手法を使って差分マクスウェル方程式を解く電磁波伝搬シミュレータ・ライブラリの一つにMeepがあります.
MeepはCPUのみで動作するソフトウェアであり,並列処理の実装にMPIを使っています.またMeepは公式にはWindows環境でのビルドがサポートされていないため,どうしてもWindowsPCでMeepを使いたい場合には,WSLを用いてWindows上のLinuxサブシステムを用いて実行するようにと公式ドキュメントに書いてあります.
さて,MeepをWSL上で実行する場合,WSL1とWSL2で実行速度に差があるならば,より高速な環境を選ぶべきです.一般に,WSL1はシステムコールの変換とファイルIOが実行速度のボトルネックになり,WSL2はWSL1の課題は克服した一方でWindows環境とのファイル共有に難がある,ようです.この辺に関しては,ちょっとググると沢山ベンチマークが出てきます.しかし,MeepでCPU Boundな処理をMPIで並列化した場合の使用プロセス数v.s.実行時間についてWSL2とWSL1とを比較した記事は見当たらなかったのと,せっかく調べたので供養のためにこの記事を書きます.
念の為,割と適当にやっているので追試の結果や再現性に責任は持ちません.
実行環境 (PC)
CPU: Intel Xeon E5 2690 v3 12Core 2.6GHz (All core boost: 3.1GHz)
Hyper-Threading: Enabled
RAM: DDR4 2133 8G ECC Reg x4, Total 32Gbyte
OS: Windows 10 v1909 Build 18362.1082
OS(WSL1): Ubuntu 20.04 LTS
OS(WSL2): Ubuntu 20.04 LTS
実行環境 (Anaconda, WSL1/2 で共通)
Anaconda 3 (https://repo.anaconda.com/archive/Anaconda3-2020.07-Linux-x86_64.sh)
Anacondaインストール後,以下のコマンドでMeepをインストール
conda create -n pmp -c conda-forge pymeep=*=mpi_mpich_*
テストに用いたスクリプト
Meepのgitレポジトリ内にあるサンプル “coupler.py” 及び “coupler.gds“
実行速度の測定
MPIの実行プロセス数1から24についてそれぞれ,上記のcoupler.pyを実行しその開始から修了までの時間を計測します.実行時間にはcoupler.pyが結果の最終行に出力する”Elapsed run time =”の値を用います.
実行コマンド
for ii in $(seq 24); do mpirun -np ${ii} python coupler.py ; tt${ii}.out ; done
結果
Meepでのcoupler.pyの実行時間をWSL2とWSL1とで比べた結果は以下のグラフの通りです.横軸がMPIで並列実行した際の使用プロセス数,縦軸が実行に用した時間を示します.
WSL2 と WSL1 とではHyper-Threadingの恩恵の受け方に差があるようです.この結果を見た限りではWSL2はHyper-Threadingによる性能向上が期待できる一方で,WSL1ではそれがないようです.特に15プロセス以上の並列化をした際に,WSL1とWSL2との実行時間の差は単調に増加する傾向を示していて,一貫性が認められます.
また,プロセス数が12以下のHyper-Threadingの恩恵を受けない状況下では,WSL1の方が実行時間が短くなる傾向が示されています.プロセス数1では28.21秒,プロセス数11及び12ではそれぞれ4.20秒及び6.60秒,WSL1の方がWSL2より実行時間が短くなっています.
ざくっとまとめると,Hyper-Threadingの恩恵を受ける場合にはWSL2の方が,受けない場合にはWSL1の方が早い場合がある.というところでしょうか.より確かな結果を得るには,BIOSの設定でHyper-Threadingの有効/無効を切り替える,統計検定を行う(他のソフトウェアのノイズが多少あるので),などなど詰めるべき所が沢山あります.
しかし,WSL上でMPIを実行するなんてどうせPC1台でちまちま計算する場合のみですし.逆に言えば,WSLのバージョンの違いなんて大した差にならない,という結果とも言えます.実際WSL1とWSL2の最小実行時間の差は4.06秒であり,それはWSL2の最小実行時間の5.81%です.この5.81%が待てないような状況なら,WSLなんて使ってる場合ではないのでちゃんとMPIクラスタを使うべきだと思います.(って,調べた意味w)
ちゃんちゃん♪おしまい.