

高岡智則
年齢:33歳 性別:男性 職業:Webディレクター(兼ライティング・SNS運用担当) 居住地:東京都杉並区・永福町の1LDKマンション 出身地:神奈川県川崎市 身長:176cm 体系:細身〜普通(最近ちょっとお腹が気になる) 血液型:A型 誕生日:1992年11月20日 最終学歴:明治大学・情報コミュニケーション学部卒 通勤:京王井の頭線で渋谷まで(通勤20分) 家族構成:一人暮らし、実家には両親と2歳下の妹 恋愛事情:独身。彼女は2年いない(本人は「忙しいだけ」と言い張る)
はじめに
openmpi という名前を聞くと難しそうに思えるかもしれませんが、基本を知れば誰でも分散処理の世界へ入ることができます。本稿では openmpi の意味や使い方の全体像を中学生にもわかるように丁寧に解説します。openmpi は複数の計算機をつなぎ 一つの大きな計算機のように動かすためのソフトウェアです。ここでいう計算機とはパソコンやサーバーを指し それらをネットワークで結ぶことで同時に計算を行います。openmpi はそのネットワーク通信を仲介して 各プロセスと呼ばれる小さな計算単位どうしが情報を交換できるようにします。
openmpiとは何か
openmpi とは分散処理の標準である MPI の実装の一つです。MPI は Message Passing Interface の略で 複数の計算機を組み合わせて大きな計算を行うときに プロセス同士がデータをやり取りするための約束事を定義します。openmpi はこの約束事を守りつつ 実際の通信をネットワーク経由で実現します。openmpi は Linux やmacOS だけでなく Windows の環境でも利用できることが多く、さまざまなネットワークバックエンドを選べるのが特徴です。
なぜ openmpi を使うのか
大規模な数値計算や科学計算では 一台のパソコンだけでは足りないことがあります。そのようなとき openmpi を使うと 複数の計算機を協力させて 1つの大きな問題を解くことができます。計算の速度を上げることができるだけでなく、研究や技術開発の現場で再現性のある実験環境を作る手助けにもなります。
基本的な仕組み
openmpi では 多くの処理を同時に進めるために プロセスと呼ばれる小さな計算の集まりを作ります。全てのプロセスは MPI_COMM_WORLD という共通の世界を共有します。これを使うことで プロセス同士が互いのアドレスを知り データを送信したり受け取ったりします。実際の動作は ネットワーク経由で行われ、mpirun や mpicc などの道具を使って実行します。
実際のインストールと準備
代表的な Linux での手順は次の通りです。apt や yum で Open MPI のパッケージを入れ 連携していくことで コンパイルと実行がスムーズになります。例として Debian 系の環境では以下のようなコマンドを使います。
1 行目はコンパイラの用意と MPI ライブラリの取得です。sudo apt-get update sudo apt-get install -y openmpi-bin openmpi-common libopenmpi-dev
2 行目は MPI プログラムをコンパイルします。mpicc -o hello hello.c
3 行目は 実行です。<span>mpirun -np 4 ./hello
簡単な Hello MPI の例を想定した流れ
次の説明は テキストベースの想像ですが 実際には C 言語等で書かれた MPI プログラムを コンパイルして実行します。簡単な Hello World の例 では 各プロセスが自分の ID を表示し 最後に どのプロセスが何番目かを出力します。
手順としては ① hello.c の作成 ② mpicc でコンパイル ③ mpirun で実行 の3つです。実行環境によっては ホストファイルを用意して どのノードを使うか指示する必要があります。
よくある質問と注意点
・MPI のバージョンによって 挙動が微妙に異なることがあります。現在の環境と Open MPI のバージョン を合わせることが大切です。
・開発機と本番機で ネットワーク設定が異なると 動作しないことがあります。ファイアウォールの設定や SSH の鍵の設定を整える必要があります。
表: よく使うコマンド
| コマンド | 説明 |
|---|---|
| mpicc | MPI プログラムを C でコンパイルするためのコンパイラ |
| mpirun -np N | N プロセスで実行する |
| mpic++ | C++ 用の MPI コンパイラ |
| ompi_info | Open MPI の情報を表示 |
最後に openmpi は 科学計算や大規模データ処理の現場で 多くの人に使われている 信頼性の高い実装です。正しい手順で学習を進めれば 初心者でも段階的にスキルを積み上げられます。
openmpiの同意語
- Open MPI
- オープンソースのMPI実装のひとつ。複数のプラットフォームに対応し、プロセス間通信を提供するMPI規格の実装です。
- OpenMPI
- Open MPIプロジェクトが提供する、オープンソースのMPI実装。高性能な並列通信機能を提供します。
- Open MPIプロジェクト
- Open MPIを開発・提供する組織・プロジェクト名。MPIライブラリをオープンソースとして公開しているソフトウェア群です。
- Open MPIソフトウェア
- Open MPIを指す別称。MPIの機能を提供するソフトウェアパッケージです。
- Open MPIライブラリ
- MPI機能を提供するライブラリとしてのOpen MPI。プロセス間通信や同期機能を提供します。
- オープンソースMPI実装
- MPIの仕様をオープンソースとして実装しているソフトウェアの総称。Open MPIはその代表例です。
- オープンMPI
- Open MPIの日本語表記の一つ。オープンソースのMPI実装ソフトウェア。
- Open MPIの実装
- MPI規格を満たすソフトウェアの中で、Open MPIが該当します。並列計算向けの通信ライブラリです。
- Open MPIプロジェクトのMPI実装
- Open MPIプロジェクトが提供するMPI規格の実装。
- MPI実装のオープンソース版
- オープンソースライセンスの下で提供されるMPI実装の一例。Open MPIが該当します。
openmpiの対義語・反対語
- クローズドソースMPI
- ソースコードが公開されていない、閉じたライセンス下で提供されるMPI実装。外部の検証が難しく、サポートはベンダー依存となることが多い。
- 商用MPI
- ライセンスが商用で、オープンソースではないMPI実装。使用条件が制約され、ソース公開が限定されることが多い。
- プロプライエタリMPI
- 特定企業が知的財産として所有するMPI実装。利用はライセンス契約を結ぶ必要があり、ソース公開がされていないことが多い。
- 独自MPI
- 組織内で独自に開発したMPI実装。公開されていない場合が多く、特定環境向けの最適化が進んでいることがある。
- 非公開MPI
- 一般には公開されていないMPI実装。公開されていないため、検証や比較が難しいことがある。
- 閉鎖的MPI
- 開発プロセスやドキュメントなどが閉ざされ、オープンな協力・参加が難しいMPIの状態・実装。
- 専有MPI
- 特定ベンダーが権利を有し、他者が自由に利用・改変できないMPI実装。ライセンスに従って使用する必要がある。
openmpiの共起語
- MPI
- メッセージパッシングインターフェースの略称。分散計算でプロセス間通信を標準化する仕様で、OpenMPIはこの仕様に準拠した実装の一つです。
- MPICH
- 代表的なMPI実装のひとつ。OpenMPIと競合することがあり、互換性のあるMPIコードは両方で動作することが多いです。
- MVAPICH
- InfiniBandなどの高帯域ネットワークに最適化されたMPI実装。大規模なHPC環境でよく使われます。
- mpirun
- MPIプログラムを起動するコマンド。プロセス数やホストの指定などを行い、並列実行を開始します。
- mpiexec
- mpirunと同等の機能を持つ実行コマンド。環境によって使い分けられることがあります。
- hostfile
- MPIジョブを実行するノード情報を記述するファイル。ノード名と割り当てプロセス数を指定します。
- Slurm
- HPCクラスタで広く使われるジョブスケジューラ。MPIジョブをSlurm経由で実行する設定が一般的です。
- PBS
- Portable Batch Systemの略。ジョブ管理ツールで、MPIジョブの送信・管理に利用されます。
- Torque
- PBSの実装の一つ。ジョブスケジューリングとMPIの連携を提供します。
- gcc
- GNU Compiler Collectionの略。C/C++の主要コンパイラで、OpenMPIのビルド時に使われることが多いです。
- gfortran
- GNU Fortranコンパイラ。Fortranコードのビルドに用いられます。
- clang
- LLVM系のC/C++/Fortranコンパイラ。OpenMPIのビルドにも使われることがあります。
- C
- C言語。MPIのCバインディングを使うプログラムを開発する際に用いられます。
- Fortran
- Fortran言語。MPIのFortranバインディングを使う場合に用いられます。
- Python
- PythonからMPIを使う場合の開発環境。mpi4pyなどのバインディングと組み合わせて利用します。
- mpi4py
- Python用のMPIバインディング。OpenMPIと連携してPythonで並列処理を実行できます。
- CUDA
- NVIDIAのGPUプラットフォーム。CUDA対応MPIでGPU間通信を活用できます。
- CUDA-aware MPI
- CUDAデバイスのバッファをMPI通信で直接扱える機能。GPUを用いた分散計算の性能を向上させます。
- InfiniBand
- 高帯域・低レイテンシのネットワーク技術。OpenMPIはInfiniBandをバックエンドとして高速通信が可能です。
- ibverbs
- InfiniBandの低レベルAPI。通信バックエンドの一部としてOpenMPIで使われます。
- openib
- OpenMPIがInfiniBandを利用する際の通信モジュール名。インターコネクト層の一部。
- Shared memory
- 同一ノード内のプロセス間通信を高速化する共有メモリ機構。OpenMPIではSMモジュールとして使われます。
- SM
- Shared Memoryの略。OpenMPIの通信モジュールの一つです。
- libfabric
- 高性能通信ライブラリ。OpenMPIはlibfabricを介して通信を実現することがあります。
- OpenMP
- Open Multi-Processingの略。MPIと組み合わせてハイブリッド型の並列プログラムを作る際に用いられます。
- ompi_info
- OpenMPIのビルド情報・設定を表示するコマンド。現在の構成を確認できます。
- autotools
- 自動構成ツールの総称。OpenMPIのソースビルド時に使われることがあります。
- configure
- OpenMPIをビルドする際の設定スクリプト。コンパイラやライブラリの検出を行います。
- make
- ソースコードをビルドする標準的なツール。OpenMPIのビルドにも使われます。
- cmake
- ビルド設定ツール。OpenMPIの周辺ソフトの構成に使われることがあります。
- environment modules
- 環境モジュール。複数のソフトウェアバージョンを切り替えやすくする仕組みです。
- Lmod
- 環境モジュールの実装の一つ。OpenMPIのバージョン切替を容易にします。
- Homebrew
- macOS向けのパッケージマネージャ。OpenMPIのインストールにも使われます。
- Ubuntu
- Debian系の代表的ディストリビューション。OpenMPIのパッケージがaptで提供されています。
- Debian
- Debian系OS。OpenMPIのビルド・インストール手順が公開されています。
- RHEL
- Red Hat系OS。OpenMPIのパッケージがdnf/yumで提供されています。
- macOS
- MacでのOpenMPIの利用。HomebrewやMacPortsでのインストールが一般的です。
openmpiの関連用語
- Open MPI
- MPI実装のひとつで、複数のノードをまたいだ並列計算を可能にするライブラリ。OSSとして広く使われ、複数の通信バックエンドや機能拡張を柔軟に組み合わせられます。
- MPI
- Message Passing Interfaceの略。分散メモリ環境でプロセス間通信を行う標準的なAPIです。
- MPICH
- 別のMPI実装で、MPI標準を実装するプロジェクト。Open MPIと並ぶ主要なMPI実装の一つです。
- MPI-3
- MPIの第三世代標準仕様。新機能や改善点を含む更新版です。
- MPI_Init
- MPI環境を初期化してMPIを使える状態にする関数です。
- MPI_Finalize
- MPI環境を終了し、リソースを解放する関数です。
- MPI_Init_thread
- 複数スレッドを使うMPIアプリケーションの初期化。要求するスレッドサポートレベルを指定します。
- MPI_Query_thread
- 現在のスレッドサポートレベルを問い合わせる関数です。
- MPI_THREAD_SINGLE
- アプリケーションが1つのスレッドのみでMPIを呼び出す設定レベル。
- MPI_THREAD_FUNNELED
- 外部スレッドはMPIを呼び出さず、MPI呼び出しは主スレッドだけが行います。
- MPI_THREAD_SERIALIZED
- 複数スレッドがMPI呼び出しを連続して行えるが同時には実行されません。
- MPI_THREAD_MULTIPLE
- 複数スレッドが同時にMPI呼び出しを安全に行えるレベル。
- MPI_Comm_size
- 指定したコミュニケータ内のプロセス数を取得します。
- MPI_Comm_rank
- 現在のプロセスの順位(ランク)を取得します。
- MPI_COMM_WORLD
- 全プロセスを含むデフォルトのコミュニケータ。
- MPI_Comm_dup
- 既存のコミュニケータを複製して新しいコミュニケータを作成します。
- MPI_Comm_split
- 同じグループの中でサブコミュニケータを作成します。
- Communicator
- プロセス間通信を行う論理的な集合。MPIの基本単位です。
- Rank
- コミュニケータ内で各プロセスが持つ識別子。0から始まる整数です。
- Process
- MPIで動作する1つの実行単位です。
- MPI_Send
- ポイントツーポイント通信でデータを送信します。
- MPI_Recv
- ポイントツーポイント通信でデータを受信します。
- MPI_Isend
- 非ブロッキング送信。送信を開始して処理を続けられます。
- MPI_Irecv
- 非ブロッキング受信。受信を開始して処理を続けられます。
- MPI_Wait
- 非ブロッキング通信の完了を待つための関数です。
- MPI_Barrier
- 全プロセスが同期する障害物のような通信操作です。
- MPI_Bcast
- 1つのプロセスがデータを全プロセスへ配布します。
- MPI_Scatter
- データを各プロセスへ等分配します。
- MPI_Gather
- 各プロセスからデータを集約して1つのプロセスへ集めます。
- MPI_Reduce
- 各プロセスのデータを畳み込み、1つの結果を得ます。
- MPI_Allreduce
- 全プロセスに集計結果を配布します。
- MPI_Allgather
- 各プロセスのデータを全プロセスへ配布します。
- MPI_Alltoall
- 各プロセスが他の全プロセスへデータを送受信します。
- MPI_Status
- 通信操作の状態情報を返す構造体です。
- MPI_Request
- 非ブロッキング通信の進行状況を表す識別子です。
- MPI_Datatype
- データの型情報を表します。基本型と派生型を扱います。
- Derived datatype
- 複雑なデータ構造をMPIで送るための派生データ型。
- MPI_Type_vector
- 派生データ型を作るための典型的な例。
- MPI_Wtime
- 経過時間を取得するためのタイマー関数です。
- Cartesian topology
- 格子状のトポロジーを作成して、近接ノードの通信を効率化します。
- MPI_Cart_create
- 格子状トポロジーを作成する関数。
- MPI_Graph_create
- グラフ状トポロジーを作成します。
- One-sided communication (RMA)
- 1発の操作でリモートのメモリへ読み書きできる通信モデルです。
- MPI_Win_create
- RMA用のウィンドウを作成します。
- MPI_Put
- リモートのウィンドウへデータを書き込みます。
- MPI_Get
- リモートのウィンドウからデータを取得します。
- MPI_Win_free
- RMAウィンドウを解放します。
- hwloc
- ハードウェアの物理的トポロジーを把握するためのライブラリ。Open MPIの最適化に使われます。
- BTL / PML / SM / TCP
- Open MPIの通信層構造の略称。SMは共有メモリ、TCPはTCP/IP、BTLはデータ転送モジュール、PMLは通信プロトコル層です。
- MCA parameters
- Open MPIのモジュール構成を制御する設定項目です。
- ompi/mpirun / orterun
- MPIプログラムを起動するコマンド。Open MPIで実行を管理します。
- hostfile / machinefile
- 実行ノードを指定するファイル。各ノードの割り当てを定義します。
- binding and mapping
- プロセスのCPU割り当てとノード間の配置を制御します。
- --bind-to-core
- コア単位でプロセスを固定します。
- --bind-to-socket
- ソケット単位でプロセスを固定します。
- -map-by
- プロセスの割り当て方を指定します。
- -map-by ppr
- 1ノードあたりのプロセス数などの割り付け指示。
- Hybrid MPI+OpenMP
- MPIとOpenMPを組み合わせて並列化する設計手法。
- Slurm integration
- Slurmなどのジョブスケジューラと連携してMPIジョブを実行します。
- BLCR / Checkpoint/restart
- 障害発生時に状態を保存して再開するチェックポイント機能。BLCRが実装例です。
- ompi-checkpoint
- Open MPIのチェックポイント作成コマンドの一部です。
- mpi4py
- PythonからMPIを使うためのbindingです。/ PythonでMPIプログラムを作成できます。
- UCX
- 高速通信バックエンドの一つ。Open MPIでUCXをバックエンドとして選択できます。
- PMPI
- MPIのプロファイリングインターフェース。自前のプロファイラを組み込みやすくするための低レベルAPIです。
- MPI_Errhandler
- エラーハンドリングの仕組みを設定します。
- MPI_ABORT
- エラー時にMPIアプリケーションを強制終了します。
- mpi.h
- C言語でMPIを利用する際のヘッダファイルです。
- mpi.f08
- Fortran向けMPIインターフェースのモジュール。
- latency / bandwidth
- 通信の速度特性を表す基本的な指標。遅延と帯域幅の最適化がパフォーマンスに直結します。
- MPI-2 features
- MPI-2で追加された機能群。RMA、I/O、アトミック操作などを含みます。



















