alfort's Blog

プログラミングとかLinuxとかのメモ

MPI (Message Passing Interface) を勉強してみる

MPI (Message Passing Interface) を勉強してみる

2019/06/23追記: FedoraでのMPIのパッケージのインストールが思ったより厄介だったので、インストール方法について追記

MPIは並列コンピューティングのための規格で、これについて勉強しているのでそのメモ。

ja.wikipedia.org

スーパーコンピュータなどを使うHPC (High Performance Computing)の世界では、自分でアプリケーションを実装するようなユーザの場合、使いこなせなければならないようだ。

理論的なところはひとまず置いておいて、手を動かしながら学んでいくつもり。

また、このブログではOpen MPIを中心に扱っていく予定。

MPIの規格、実装

MPIはあくまで規格でしかなく、実装自体は様々なものがある。

オープンソースな実装でいうと Open MPI、MPICHあたりが有名。

www.open-mpi.org

www.mpich.org

MVAPICHは最新のものがバイナリで配布されており、多少古くなったものになってくるとソースコードが公開されるようになっているらしい。

mvapich.cse.ohio-state.edu

MPIのインストール

ひとまず割愛。

使っているOSに合わせて以下を使い分ければひとまず使えそうな印象。

Fedoraの場合

dnf install openmpi
module load mpi/openmpi-x86_64

Fedoraの場合、インストールしただけではPATHが通っていない。

とりあえず動かしたいだけなら、新しいシェルを呼び出すたびにmoduleを呼ぶ必要がある。

以下なんでこうなっているかの情報。

これは、Fedoraの標準のリポジトリに入っているもう一つのMPI実装、MPICHのためのようである。

MPICHもOpen MPI同様に同じコマンド名で同じ機能を提供する。

Fedoraのパッケージマネージャであるdnf としては両方のパッケージをインストールすることを許すため、何らかの仕組みを使ってMPICHとOpen MPIを明に選択する必要がある。

明に選択するのが、module コマンドの役割で、同じ機能を持つ全く別のパッケージを使い分けることができる。

Ubuntu 等の場合

とりあえずaptなどで以下のコマンドを打っておけば使えるようになりそう。

未検証。

apt install openmpi

macOS の場合

Homebrew と呼ばれる有志のパッケージマネージャをインストールしていれば、以下のコマンドでOpen MPIをインストールできる。

brew install open-mpi

brew.sh

ソースコードからビルドしても良いのだけれども、結構面倒くさい。

MPIプログラムの作成

とりあえず、こんなリポジトリを作った。

github.com

自分でプログラムをコピペするのが面倒な人はどうぞ。

まずは普通のCプログラムを書いてみる。

ファイル名はhello.cにした。

MPI独自のことは何もやっていないけど、とりあえずこれで動くはず。

#include <stdio.h>

int main() {
    printf("Hello, MPI World.\n");
    return 0;
}

MPIプログラムのコンパイル、実行

コンパイル

MPIプログラムのコンパイルをやってみる。 といっても、基本的に以下のようにgccのようなコマンドの代わりにmpiccを使えば良い。

$ mpicc hello.c

普通の環境であればa.outが生成されていると思う。

実行

普通のCプログラムであれば、./a.outを端末で実行するだけで良いのだけれども、MPIプログラムの場合はちょっと異なる。

今時のマルチコアマルチスレッドプロセッサの場合、2プロセスでの実行ぐらいはできると思う。

$ mpiexec -np 2 a.out
Hello, MPI World.
Hello, MPI World.

以上のように、2プロセスで実行したので2回Hello, MPI World.が表示されたと思う。

MPIプログラムの場合、基本的にはmain関数を複数のプロセスで実行して、その結果を出力する。

このままではすべてのプロセスが全く同じ処理を勧めてしまうため、処理内容を変えるために、MPIで規格される独自の関数を使う。

Windowsでホームポジションから手を動かさずにEmacs風に操作する

Windows自体の操作もLinux風にしたい…

少し前にこんな記事を書いた。

alfort728.hatenablog.com

この設定でだいぶ日本語入力、英数入力の不快感とか、最低限のターミナル操作を行う上での不快感は軽減されたものの、今度は別のキーに対しての不快感が目立つようになってきた。

それは Deleteキー、BackSpaceキー、ファンクションキー、矢印キー、Homeキー、Endキーである。

これらのキーはめちゃくちゃ使うキーなのに、なぜかホームポジションから外れたところに配置してある。

Linuxとかの端末を操作していると、これらのキーはCtrlキーとの組み合わせで実現できるので大したことはないのだけれども、Windowsではそうはいかない。

そこで、WindowsAutoHotkeyというプログラムを使ってうまく設定してみたのでその時のお話。

www.autohotkey.com

続きを読む

byobuコマンドで再起動してもセッションを保持する

byobuで再起動時にセッションを保存、復元する

ターミナルマルチプレクサの一つであるbyobuコマンドで、マシンを再起動したり、シャットダウンしてしまってもすぐに元の状態に戻したいという話。

ターミナルマルチプレクサの欠点

ターミナルマルチプレクサ系の欠点というと、セッションが保存できないことである。

自分はLinuxのサーバでbyobuコマンドを使っているので、手元のノートPCからsshした先で端末を開いている。

なので、ノートPCをシャットダウンしたり、再起動してもすぐに直前の作業の続きから始めることができる。

Linuxサーバは常時電源を入れっぱなしの状態でほとんど再起動することがない。

が、たまにパッケージの更新だったり、バージョンアップとかでマシンの電源を落とすことがある。

こういうとき、「直前の作業画面の復元」から始まることになって、時間を使ってしまう。

パッケージの更新とかはバグ修正とか新機能の追加なんかが入ることもあってできる限り頻繁にやっておきたいけれど、「直前の作業画面の復元」は面倒なのでやりたくない。

「直前の作業画面の復元」をしなくて済むように、再起動時にセッションを保存、復元できるようにする。

続きを読む

Linuxを扱う人のためのWindows10でキーボードの設定


(2019/03/15追記: この記事に書いてある方法だとCaps LockキーとCtrlキーは上書きではなく入れ替えだった) (ついでに記事タイトルとかもふわっとしてたので具体的に書いた)

(2019/03/29追記: この記事の後にキーバインドについて以下の記事で更に改善しました。)

alfort728.hatenablog.com

Windows10のキーボードの入れ替え

Windowsのデフォルトのキーバインドが馴染めないので、いろいろキーバインドを変えるという話。

日本語キーボードで言うCaps LockキーをCtrlキーに、半角全角キーをEscキーにする。

ついでに、Macの日本語キーボード風に変換キー、無変換キーに日本語入力と半角英数入力をわりあてる。

いろいろ新しいマシンのセットアップする機会があるかもしれないのでその備忘録。

続きを読む