3.2. GNU Compiler Collectionと富士通MPIの連携

3.2.1. 機能の概要

本機能により、GNU Compiler Collection (GCC) に含まれるコンパイラと富士通MPIを組み合わせて使うことができます。

使い方は2種類あり、1つはログインノードで計算ノード用のプログラムをクロスコンパイルする方法、もう1つは計算ノード上でコンパイルする方法です。

3.2.2. ログインノードでのクロスコンパイル方法

クロスコンパイルが可能なGCCコンパイラは、/vol0004/apps/oss/gcc-arm-11.2.1 (または旧版gcc-arm-10.3.1) にあります。

コンパイルを実行する前に、以下を実行して利用環境を設定します。

[_LNlogin]$ . /vol0004/apps/oss/gcc-arm-11.2.1/setup-env.sh

この方法で利用できるコンパイラのバージョンは以下の通りです。

ソフトウェア名

言語

バージョン

コマンド

gcc (GCC)

C

10.3.1 または 11.2.1

gcc

g++ (GCC)

C++

10.3.1 または 11.2.1

g++

GNU Fortran (GCC)

Fortran

10.3.1 または 11.2.1

gfortran

これらのコンパイラを用いてMPIプログラムをクロスコンパイルするには、一例として以下のように行います。

[_LNlogin]$ gcc -c test.c -o test.o
[_LNlogin]$ mpifccpx test.o -o test.exe

注意

バージョン11.2.1でオプション-std=c++17を使用する場合、下記のように-lstdc++ パスを加える必要があります。

[_LNlogin]$ export LOPT="-L/vol0004/apps/oss/spack-v0.19/opt/spack/linux-rhel8-a64fx/gcc-8.5.0/gcc-12.2.0-sxcx7kmt3qiktffgzzvrj2wmup3g32bc/lib64 -lstdc++"
[_LNlogin]$ g++ -std=c++17 -fopenmp -c test.cpp -o test.o
[_LNlogin]$ mpiFCCpx ${LOPT} -fopenmp test.o -o test.exe

注意

バージョン11.2.1を用いてmpiFCCpxでリンクした際に、 undefined reference to '__libc_single_threaded' が表示されてエラーとなる場合、 バージョンを10.3.1へダウングレードすると問題が解決する可能性があります。

Fortranを利用する場合は、以下のように行います。

[_LNlogin]$ gfortran -c test.f90 -o test.o \
              -I/vol0004/apps/oss/mpigcc/fjmpi-gcc11/include \
              -I/vol0004/apps/oss/mpigcc/fjmpi-gcc11/include/mpi/fujitsu
[_LNlogin]$ mpifrtpx test.o -o test.exe \
              -L/opt/FJSVxtclanga/tcsds-latest/lib64

上記のsetup-env.shを実行している場合、インクルードパス・ライブラリパスを設定した環境変数を利用できます。

[_LNlogin]$ $FC -c test.f90 -o test.o
[_LNlogin]$ $MPIFC test.o -o test.exe

GCCコンパイラでオブジェクトファイルをコンパイルし、リンカとして富士通コンパイラを用いることで富士通MPIとの連携が可能になります。

3.2.3. 計算ノード上でのコンパイル方法

以下のコマンドを、会話型ジョブにおいてコマンドラインで実行するか、ジョブスクリプト中に記述することにより、必要な環境変数が設定され [1]

[_CNlogin]$ . /vol0004/apps/oss/spack/share/spack/setup-env.sh
[_CNlogin]$ spack load fujitsu-mpi%gcc@8.5.0

または

[_CNlogin]$ spack load fujitsu-mpi%gcc@12.2.0

以下のコンパイル用コマンドが利用可能になります。これらは計算ノードでのみ利用可能で、クロスコンパイルはできません。

  • mpicc(C用)

  • mpicxx(C++用)

  • mpifort(Fortran用)

これらのコマンドは、それぞれGCCのgccg++gfortranコマンドに対するラッパとして機能します。したがって、元のコマンドと同じオプションを受け付けます。

この方法で利用できるコンパイラのバージョンは以下の通りです。

ソフトウェア名

言語

バージョン

コマンド

gcc (GCC)

C

8.5.0 または 12.2.0

gcc

g++ (GCC)

C++

8.5.0 または 12.2.0

g++

GNU Fortran (GCC)

Fortran

8.5.1 または 12.2.0

gfortran

3.2.4. プログラムの実行

逐次実行は、環境変数LD_LIBRARY_PATH にGCCクロスコンパイラのライブラリを追加し、実行します。

MPI並列実行は、通常の場合と同じく mpiexec コマンドにより実行することができます。逐次実行と違い、環境変数LD_LIBRARY_PATH は必要ありません。 mpiexecコマンドの形式 (オプション指定など) や実行時の設定 (MCAパラメータなど) は、通常の場合に準じます。

[逐次実行]

#!/bin/sh -x
#PJM -L  "node=1"
#PJM -L  "rscgrp=small"
#PJM -L  "elapse=01:00:00"
#PJM -s
#
export GCC="/vol0004/apps/oss/gcc-arm-11.2.1"
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$GCC/aarch64-linux-gnu/lib:$GCC/aarch64-linux-gnu/lib64"

./a.out

[MPI並列実行]

#!/bin/sh -x
#PJM -L  "node=12"
#PJM -L  "rscgrp=small"
#PJM -L  "elapse=01:00:00"
#PJM -s
#

mpiexec ./a.out