OpenMP × Intel MPI 実行環境の構築手順

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

1.Intel MPI 環境の準備

Intel MPI の提供するランタイム・コンパイラ環境を使用します。
Ubuntu 環境で Intel MPI や Intel コンパイラを利用する場合は、Intel oneAPI の導入が推奨されます。

# Intel リポジトリの追加に必要なツール(GPG鍵管理とwget)をインストール
sudo apt update
sudo apt install -y gpg-agent wget

# Intel の GPG 鍵を取得して、APT の信頼済みキーリングに保存
wget -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

# Intel oneAPI リポジトリを APT のソースリストに追加
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

# Intel oneAPI HPC Toolkit のインストール
sudo apt install intel-oneapi-hpc-toolkit

# セットアップ(毎回実行が必要です。~/.bashrc に書いておくと自動で設定されるようになります。)
source /opt/intel/oneapi/setvars.sh

詳細な手順や最新版の情報は Intel 公式サイト をご覧ください。

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

# ソースコードを作成
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.コンパイル(Intel コンパイラを使用)

# Intel MPI 用のコンパイラ wrapper(icx/mpiicx)を使用
mpiicx -qopenmp -o hybrid_test hybrid_test.c

・mpiicx: Intel MPI 用 C コンパイラ(LLVMベースの icx を使用)
・-qopenmp: OpenMP を有効にするオプション

4.実行環境の設定(OpenMPのスレッド数指定)

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

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

# 4プロセス × 各4スレッドで実行(Intel MPI はコア割り当てを自動最適化)
mpirun -n 4 ./hybrid_test

-n 4: MPI プロセス数(Intel MPI では -np でも同じ)
※物理CPUの利用状況により、処理性能が動的に変化する場合があります。性能ベンチマーク等の用途ではご留意ください。

【補足】Intel MPI のプロセス配置・制御

Intel MPI は、I_MPI_PINI_MPI_PIN_DOMAIN などの環境変数でコア割り当てを詳細に制御できます。

export I_MPI_PIN=1              # プロセスを特定のCPUコアに固定
export I_MPI_PIN_DOMAIN=omp     # OpenMPスレッドごとに分離

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

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

これで、Intel MPI × OpenMP ハイブリッド並列プログラムの基本的な動作確認が完了です。
性能を重視する場合は、Intel コンパイラ・MPI による実行環境の利用もご検討ください。