この手順は、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_PIN や I_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 による実行環境の利用もご検討ください。