IntelのMPIはFreeのOpenMPIなどに比べて高性能と言われてきました。しかし少し前まではIntel MPIは有償でそれなりに高額なので、OpenMPIとの性能差を気軽に確かめることはできませんでした。現在は無償でダウンローと可能なintel oneAPIの中にIntel MPIが含まれており、その性能を気軽に確かめることができます。このBlogではIntel oneAPIをインストールして、姫野ベンチのMPI版を使い、OpenMPIとの性能差を確認します。

使用するマシンは手元にある

hpc@workbench:~$ head /proc/cpuinfo 
processor	: 0
vendor_id	: GenuineIntel
cpu family	: 6
model		: 79
model name	: Intel(R) Xeon(R) CPU E5-2650 v4 @ 2.20GHz
stepping	: 1
microcode	: 0xb000040
cpu MHz		: 1900.000
cache size	: 30720 KB
physical id	: 0
c@workbench:~$ nproc
24
hpc@workbench:~$ free -m
              total        used        free      shared  buff/cache   available
Mem:         515840        1421      513318          31        1099      511716
Swap:             0           0           0
hpc@workbench:~$ uname -a
Linux workbench 5.15.0-73-generic #80~20.04.1-Ubuntu SMP Wed May 17 14:58:14 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
hpc@workbench:~$

になります。

Intel oneAPIをインストールするには、

# download the key to system keyring
wget --no-check-certificate -O- https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB \
| gpg --dearmor | sudo tee /usr/share/keyrings/oneapi-archive-keyring.gpg > /dev/null

# add signed entry to apt sources and configure the APT client to use Intel repository:
echo "deb [signed-by=/usr/share/keyrings/oneapi-archive-keyring.gpg] https://apt.repos.intel.com/oneapi all main" |\
 sudo tee /etc/apt/sources.list.d/oneAPI.list

を実行して、

sudo apt update
sudo apt install intel-basekit intel-hpckit

を実行するだけです。時間は結構かかります。

その後~/.bashrcの最後に

source /opt/intel/oneapi/setvars.sh

を加えてください(shellがbashの場合)。

次に理化学研究所の姫野ベンチサイトから姫野ベンチのF90 MPI版をダウンロードします。unzipするとf90_xp_mpi.lzhというファイルができますが、それをこちらの説明にあるlhaというアプリをインストールするとさらに解凍できて、himenoBMTxpr.f90 というファイルができます。下記を実行すると、姫野ベンチをダウンロードして2回解凍してhimenoBMTxpr.f90が得られます。

mkdir ~/himeno
cd himeno
 wget --no-check-certificate https://i.riken.jp/wp-content/uploads/2015/07/f90_xp_mpi.zip
unzip f90_xp_mpi.zip
sudo apt install jlha-utils -y
lha x f90_xp_mpi.lzh

 次にこれをコンパイルして実行して性能評価するのですが、最初にOpenMPIで試してみましょう。ubuntu標準パッケージのOpenMPIがありますのでそれをダウンロードして姫野ベンチをコンパイルします。

sudo apt install  openmpi-bin -y
mpif90 -Ofast himenoBMTxpr.f90 -o himeno

実行するには

mpirun -np 24 ./himeno <<.
xl
1 24 1
.

を入力します。姫野ベンチのMPI版を24コアで、配列のサイズは一番大きいXL、配列の分割はとりあえず1 24 1にして実行するコマンドです。実行結果は、

For example:
 Grid-size= 
            XS  (64x32x32)
            S   (128x64x64)
            M   (256x128x128)
            L   (512x256x256)
            XL  (1024x512x512)
  Grid-size = 

 For example: 
 DDM pattern= 
      1 1 2
      i-direction partitioning : 1
      j-direction partitioning : 1
      k-direction partitioning : 2
  DDM pattern = 

 Sequential version array size
  mimax=        1025  mjmax=         513  mkmax=         513
 Parallel version  array size
  mimax=        1025  mjmax=          24  mkmax=         513
  imax=        1024  jmax=          23  kmax=         512
  I-decomp=            1  J-decomp=           24  K-decomp=            1

  Start rehearsal measurement process.
  Measure the performance in 3 times.
   MFLOPS:   41461.028864353313        time(s):  0.65396026000000007        4.39602009E-04
 Now, start the actual measurement process.
 The loop will be excuted in         275  times.
 This will take about one minute.
 Wait for a while.
  Loop executed for          275  times
  Gosa :   4.02103731E-04
  MFLOPS:   45088.813867705132        time(s):   55.123154317000001     
  Score based on Pentium III 600MHz :   544.287964 

になりました。約45GFLOPSの結果です。

次にIntel MPIでっ同様に試してみます。

source /opt/intel/oneapi/setvars.sh
mpif90 -Ofast himenoBMTxpr.f90 -o himeno
mpirun -np 24 ./himeno <<.
xl
1 24 1
.

実行結果は、

 For example:
 Grid-size= 
            XS  (64x32x32)
            S   (128x64x64)
            M   (256x128x128)
            L   (512x256x256)
            XL  (1024x512x512)
  Grid-size = 

 For example: 
 DDM pattern= 
      1 1 2
      i-direction partitioning : 1
      j-direction partitioning : 1
      k-direction partitioning : 2
  DDM pattern = 

 Sequential version array size
  mimax=        1025  mjmax=         513  mkmax=         513
 Parallel version  array size
  mimax=        1025  mjmax=          24  mkmax=         513
  imax=        1024  jmax=          23  kmax=         512
  I-decomp=            1  J-decomp=           24  K-decomp=            1

  Start rehearsal measurement process.
  Measure the performance in 3 times.
   MFLOPS:   43863.173483990795        time(s):  0.61814645549748093        4.39602038E-04
 Now, start the actual measurement process.
 The loop will be excuted in         291  times.
 This will take about one minute.
 Wait for a while.
  Loop executed for          291  times
  Gosa :   4.00876364E-04
  MFLOPS:   47163.663748036117        time(s):   55.764220099663362     
  Score based on Pentium III 600MHz :   569.334473    

となり、OpenMPIの47163/45088=1.046倍の速度でした。