OpenMP × OpenMPI 実行環境の構築手順

この手順は OpenStack 上の Ubuntu 仮想マシンにおいて、OpenMP + OpenMPI 環境での Cプログラムのビルド・実行方法を解説しています。
ここでは、16コア環境を想定し、4 MPIプロセス × 各プロセス 4 OpenMPスレッド(合計16並列)での実行を例とします。

1.必要なパッケージをインストール(コンパイラ・MPI・可視化ツール)

# パッケージ情報を更新
sudo apt update
# 開発に必要なツールを一括インストール
sudo apt install -y build-essential gfortran openmpi-bin libopenmpi-dev hwloc

・build-essential: C/C++用のビルドツール(gcc, make など)
・gfortran: Fortranコンパイラ(今回は使わないが必要になることが多い)
・openmpi-bin, libopenmpi-dev: MPI実行環境・ライブラリ
・hwloc: コア配置を確認するツール(lstopo)

2.テスト用ソースコードを作成

# ソースコードを作成・編集(ここではviエディタを使用)
vi hybrid_test.c

以下の内容を貼り付けて保存(Esc を押してから :wq と入力し、Enter で保存終了)

#define _GNU_SOURCE
#include <stdio.h>
#include <mpi.h>
#include <omp.h>
#include <sched.h>

int main(int argc, char** argv) {
    int provided;
    MPI_Init_thread(&argc, &argv, MPI_THREAD_FUNNELED, &provided);

    int mpi_rank, mpi_size;
    MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
    MPI_Comm_size(MPI_COMM_WORLD, &mpi_size);

    #pragma omp parallel
    {
        int thread_id = omp_get_thread_num();
        int num_threads = omp_get_num_threads();
        int cpu_id = sched_getcpu();

        printf("MPI Rank %d/%d: OpenMP Thread %d/%d running on CPU %d\n",
               mpi_rank, mpi_size, thread_id, num_threads, cpu_id);
    }

    MPI_Finalize();
    return 0;
}

3.コンパイル(OpenMP + MPI 両対応)

# OpenMPとMPIに対応した実行ファイルをビルド
mpicc -fopenmp -o hybrid_test hybrid_test.c

・mpicc: OpenMPI に付属する MPI 用 Cコンパイラ(gccベース)
・-fopenmp: OpenMPを有効にする
・-o hybrid_test: 出力ファイル名を指定

4.実行環境の設定(OpenMPの動作を制御)

# 各MPIプロセスが使用するOpenMPスレッド数を設定
export OMP_NUM_THREADS=4

5. 実行(MPI × OpenMP ハイブリッド)

# 4プロセス×各4スレッドで並列プログラムを実行
mpirun -np 4 --map-by slot:PE=4 ./hybrid_test

-np 4: 4つのMPIプロセスを起動
--map-by slot:PE=4: 各プロセスに4スレッド分のコアを割り当てる
合計で 4プロセス × 4スレッド = 16 並列 で実行
※物理CPUの利用状況により、処理性能が動的に変化する場合があります。性能ベンチマーク等の用途ではご留意ください。

【補足】Intel MPI を使用する場合

Intel MPI環境では、OMP_NUM_THREADS の設定を Intel MPI ランタイムが自動的に認識し、コア割り当ても最適化されるため、通常は --map-by のようなオプション指定は不要です。

また、Intel コンパイラでビルドしたバイナリは、GCCと比べて 1〜2割ほど高速になる場合が多く、性能重視の用途では Intel 環境の利用も検討する価値があります。

OpenMP × Intel MPI 実行環境の構築手順については、こちらをご参照ください。

実行結果例(仮想CPUが16コアある場合)

MPI Rank 1/4: OpenMP Thread 0/4 running on CPU 4
MPI Rank 1/4: OpenMP Thread 3/4 running on CPU 7
MPI Rank 1/4: OpenMP Thread 2/4 running on CPU 5
MPI Rank 1/4: OpenMP Thread 1/4 running on CPU 6
MPI Rank 2/4: OpenMP Thread 0/4 running on CPU 8
MPI Rank 2/4: OpenMP Thread 3/4 running on CPU 11
MPI Rank 2/4: OpenMP Thread 2/4 running on CPU 9
MPI Rank 2/4: OpenMP Thread 1/4 running on CPU 10
MPI Rank 0/4: OpenMP Thread 0/4 running on CPU 0
MPI Rank 0/4: OpenMP Thread 2/4 running on CPU 2
MPI Rank 0/4: OpenMP Thread 1/4 running on CPU 3
MPI Rank 0/4: OpenMP Thread 3/4 running on CPU 1
MPI Rank 3/4: OpenMP Thread 0/4 running on CPU 12
MPI Rank 3/4: OpenMP Thread 3/4 running on CPU 15
MPI Rank 3/4: OpenMP Thread 2/4 running on CPU 14
MPI Rank 3/4: OpenMP Thread 1/4 running on CPU 13

これで、C言語で実装した OpenMP × OpenMPI 並列プログラムの基本的な動作確認が完了します。
この構成を基に、実際の数値計算や並列処理コードへ発展させていただければと思います。