WindowsでLinuxや並列計算の練習をしよう
(準備編)
⼤野

概要
• みなさんのPCは、複数のCPUコアが搭載されています• スーパーコンピュータやワークステーションで並列計算をするための練習を⾃分のPCでやってみよう• ラップトップPCで環境を作れば、家でもどこでも練習ができます• WSLを利⽤する• Windows11になって、だいぶ便利になったので、資料を部分的に作り直しました概要(並列計算)• 複数のCPUコアが搭載されているにもかかわらず、普通にプログラムを作ったのでは、1コアしか使⽤していない• 例えば、4コアあるのに1コアしか使わないのでは、潜在能⼒の25%しか使わないようなもの• 上の例では、普通のプログラムはPCの潜在能⼒の25パーセントしか使えないが、並列のプログラムでは残りの75パーセントも使⽤する(北〇神拳に近いかも)• ⼀騎打ち戦法から集団戦法へ

⼿順
以下を実⾏すれば、⾃分のPCでMPIやOpenMPが練習できるようになります。
1. Windows Subsystem for LinuxでUbuntuをインストールする• コマンド⼀発でできるようになった！

2. X11系のアプリのインストール
3. gcc, g++, gfortran, makeのインストールと動作確認
4. OpenMPIのインストールと動作確認

Ubuntuのインストール -1
1.

スタートボタン2.

「すべてのアプリ」を選ぶ

Ubuntuのインストール -2• 「Windowsツール」

Ubuntuのインストール -3• Windows PowerShellを右クリック• 「管理者として実⾏」

Windows10の場合• 同様にWindows Power Shellを管理者として実⾏するUbuntuのインストール -4

1. wsl␣--update、wsl --shutdownでwslをアップデート、再起動する
2. wsl␣--install␣-d␣UbuntuでUbuntuをインストール

Ubuntuのインストール -5• 別なWindowが⾃動的に開く
しばらくたつと• Linuxで使うユーザー名とパスワードを聞いてくるので⼊⼒する（忘れないこと）

Ubuntuのインストール -6
いろいろなソフトをインストールする前に、• sudo apt-get update• sudo apt-get upgradeを⼊⼒する（重要！）• 頻繁に実⾏しよう！

Ubuntuの起動 -1• 「すべてのアプリ」から探してみるUbuntuの起動 -2.1
• Windows11の場合、Windows Terminalからも起動できるUbuntuの起動-2.2• Ubuntuを選ぶ• Ubuntuのタブが現れる• ただし、カレン
トディレクトリがUbuntuのホームじゃないので、「cd」コマンドで直す

X11のアプリ -1• グラフィカルなソフトが使えるようにしよう• X11のアプリをインストール

sudo apt install x11-apps

X11のアプリ-2• xeyesで上のプログラムが起動する• xcalc, xclockなども試してみる• wslのアップデートを忘れてエラーが出て起動できない場合、Ubuntuを終了した後、Windows
PowerShellで下記を実⾏して、Ubuntuを起動する• wsl --update• wsl --shutdownWindows10の場合• X11のアプリを使うためにVcXsrv Windows XserverというWindows⽤ソフトをインストールする。

Windows10の場合

VcXsrv Windows X serverを起動して• export DISPLAY=[PCの名前]:0.0として、環境変数を設定すると、x11のアプリのWindowがオープンできるようになる• [PCの名前]は、localhostでもOK

X11のアプリ -3• geditなど、GUIなエディタも利⽤できるので、インストールする• xeyesを起動したままだと、次のコマンドが打てないので、右上の×を押して終了する• onekoという可愛いソフトもあるgccなどのインストール -1• gccとコマンドを打つと、not foundとでるが、インストールするためのコマンドも表⽰されるので、それをそのまま⼊⼒する• sudo apt install gcc

gccなどのインストール -2
同様にして、g++,gfortran, makeをインストールする。
makeはmake-guileを選択する。
なお• gcc: C Compiler• g++: C++ Compiler• gfortran: FortranCompilergccなどの動作テスト -1
C, C++, Fortranのプログラム⼊⼒と実⾏の⼿順• geditなどのエディタでプログラムを⼊⼒する(テキストファイル)• ⼊⼒したプログラムを保存する• コンパイラでコンパイルする→実⾏ファイルができる• ⽂法エラーなどがあると、コンパイル時にエラーが出てコンパイルできない• 論理的なエラーは検出されない• 実⾏ファイルを実⾏する

gccなどの動作テスト -2
1. gedit⏎として、geditを起動する
2. プログラムをここに⼊⼒
3. 終わったら「Save」ボタンを押す

gccなどの動作テスト-3• 名前を⼊⼒して、「Save」ボタンを押す• ファイルが保存される

gccなどの動作テスト -4#include<stdio.h>
int main(int argc, char **argv){printf("Hello, World!¥n");return 0;}

1. これをgeditで⼊⼒して、test.cとして保存する
2. gcc ファイル名 とするとコンパイルできる
3. コンパイルすると、a.outという実⾏ファイルができる
4. カレントディレクトリを表す./をつけて実⾏する• gcc -o test test.cとすると、a.outではなく、testという実⾏ファイルができるgccなどの動作テスト -5#include<iostream>• g++やgfortranでも、同じ
using namespace std;ようにしてコンパイルできる
int main(int argc, char **argv){
cout << "Hello, World!(cpp)¥n";• これを⼊⼒してtest.cppとreturn 0;して保存}
test.cpp• g++ ファイル名

gccなどの動作テスト -6
program helloworld
print *, "Hello, World!(F90)"
end program helloworld
test.f90• g++やgfortranでも、同じようにしてコンパイルできる• gfortran ファイル名

OpenMPの動作テスト -1• 現在インストールされるgcc, g++, gfortranは、デフォル
トでOpenMPの利⽤が可能• コンパイル時に、-fopenmpオプションをつける#include <stdio.h>#include <omp.h>
int main(int argc, char **argv){
int i;#pragma omp parallel for private(i)for(i=0; i<16; i++){printf("i=%d thread num = %d¥n",i, omp_get_thread_num());}
return 0;}

C⾔語
omptest.cOpenMPの動作テスト-2• 現在インストールされるgcc, g++, gfortranは、デフォル
トでOpenMPの利⽤が可能• コンパイル時に、-fopenmpオプションをつける
program omptest
use omp_lib
integer :: i!$omp parallel do private(i)do i=0, 15
print *,"i and thread num ", i, omp_get_thread_num()end doend program omptest
omptest.f90

FortranOpenMPの動作テスト-3• 6コアのPCで実⾏したところ、スレッドが12(0〜11)も⽣成された(Hyper Threading)• 環境変数やOpenMPの関数でスレッド数を制御できる

C⾔語

FortranMPI -1• MPIを利⽤するために、OpenMPIのインストー
ルを⾏う• mpirunとコマンドを打ってみる• openmpi-binを選ぶ

MPI -2
MPIを⽤いたプログラムのコンパイルには、• mpicc：C⾔語のプログラム• mpic++：C++⾔語のプログラム• mpif90：Fortran⾔語のプログラムを利⽤する。
後述するが、-fopenmpと組み合わせることも可能で、この場合、MPIとOpenMPのハイブリッド並列化される

MPIの動作テスト-1• C⾔語のMPIプログラムをmpiccでコンパイル• 各プロセスが、Hello,Worldを表⽰する

MPIの動作テスト-1#include <stdio.h>#include "mpi.h"
int main(int argc, char **argv){
int np, myrank;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD,&np);
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
printf("Hello, World myrank=%d size = %d¥n", myrank, np);
MPI_Finalize();
return 0;}
mpitest.cMPIの動作テスト-1#include <iostream>#include "mpi.h"using namespace std;
int main(int argc, char **argv){
int np, myrank;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD,&np);
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
cout << "Hello, World myrank="<< myrank << " size = "<<np<<"¥n";MPI_Finalize();
return 0;}
mpitest.cpp

MPIの動作テスト-2

実⾏には、mpirunを使う• mpirun –np [プロセス数] [program][プロセス数]のところには、MPIプロセスの数、[program]のところにはプログラム名
例では、プロセス数4で、カレントディレクトリのa.outを実⾏している（何か警告が出ている）

MPIの動作テスト-3
Fortranでも同様に、プログラム実⾏には
mpirunを使う

MPIの動作テスト-3
program mpitest
use mpi
implicit none
integer :: np, myrank
integer :: ierrcall mpi_init(ierr)call mpi_comm_size(mpi_comm_world,np,ierr)call mpi_comm_rank(mpi_comm_world,myrank,ierr)print *,"Hello, World myrank and size = ", myrank, np
call mpi_finalize(ierr)end program mpitest
mpitest.f90

MPIの動作テスト-4• 6コアのパソコンで8プロセスで起動しようとしたら、エラーが出た。コアの数を超えるプロセスは⽣成できない設定のようだMPIの動作テスト-5(解決法は検索して⾒つけました)

おまじないをつけることで、警告やエラーをでなくできる。
aliasという機能で、mpirun⾃体をおまじない付きにするmpirun -oversubscribe --mca btl_vader_single_copy_mechanism noneMPI+OpenMPの動作テスト (C⾔語) -1• MPIとOpenMP両⽅で並列化するプログラムのコンパイ
ルには、mpiccやmpif90に-fopenmpオプションを付け加えればよいMPI+OpenMPの動作テスト (C⾔語) -1#include <stdio.h>#include <omp.h>#include "mpi.h"
int main(int argc, char **argv){
int i, np, myrank;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD,&np);
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
omp_set_num_threads(3);#pragma omp parallel for private(i)for(i=0;i<3;i++){printf("Hello, World myrank=%d size = %d thread =%d¥n",myrank, np, omp_get_thread_num());}
MPI_Finalize();
return 0;}
hybtest.cMPI+OpenMPの動作テスト (C⾔語) -2• このプログラムでは、omp_set_num_threads(3)でス
レッド数を3にしている• 実⾏すると、各MPIプロセス(myrank=0, 1)で、OpenMPのスレッドが3(thread = 0, 1, 2)つ⽣成される• このプログラムでは、MPIプロセスx2、各MPIプロセスでOpenMPスレッドx3なので、合計2x3=6コア使う

MPI+OpenMPの動作テスト (Fortran) -3• これで並列計算の練習ができるようになった！

MPI+OpenMPの動作テスト (Fortran) -3
program hybridtest
use mpiuse omp_lib
implicit none
integer :: i, np, myrank
integer :: ierrcall mpi_init(ierr)call mpi_comm_size(mpi_comm_world,np,ierr)call mpi_comm_rank(mpi_comm_world,myrank,ierr)call omp_set_num_threads(3)!$omp parallel do private(i)do i=0, 2
print *,"Hello, World myrank, size, threadn = ", myrank, np, omp_get_thread_num()end docall mpi_finalize(ierr)end program hybridtest

hybtest.f90

.bashrcの編集 -1• mpirunをubuntu起動時に⾃動で設定したい• .bashrcに付け加えることで実現できる

mpirunのaliasを.bashrcに書いてしまうWindows10の場合• displayもmpirunもubuntu起動時に設定したい• .bashrcに付け加えることで実現できる

mpirunだけでな
くDISPLAYのことも.bashrcに書いてしまう.bashrcの編集 -2• .bashrcは、ホームディレクトリにある• lsでは見えない。ls –a で見える
• gedit␣.bashrc⏎とすると、geditで編集できるようになる• 「Save」ボタンを押して上書き保存する

Winとのファイルのやりとり-1• Ubuntuから、Cドライブなどにアクセスしたい場
合は、/mnt/ドライブ とする• 例えば、c:¥dataにあるcのプログラム(拡張⼦がc)のファイルをカレントディレクトリにコピーしたい場合は、cp␣/mnt/c/data/*.c␣.⏎とすればよい。
これでWindows側とファイルのやり取りができる。

Winとのファイルのやりとり-2
Windows11の場合、⾮常に簡単にファイルをやり取りできるエクスプローラで直接アクセスすることができる

Winとのファイルのやりとり-3

homeディレクトリの中にユーザーのホームディレ
クトリがある付録
アンインストールしたはずのUbuntuがエクスプ
ローラやWindows Terminalに現れる場合• Windows PowerShellで• 「wsl -l -v」としてインストールされたUbuntuのバージョンやステイタスを⾒る• アンインストールしたものは「STATE」がSTOPPEDとなっているので、それを「wsl --unregister XXXX」として削除する。XXXXはUbuntuのディストリビューション名(NAMEのところでわかる)を⼊れる。