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

概要
• みなさんのPCは、複数のCPUコアが搭載されています• スーパーコンピュータやワークステーションで並列計算をするための練習を⾃分のPCでやってみよう• ラップトップPCで環境を作れば、家でもどこでも練習ができます• WSL1 or WSL2を利⽤する

概要(並列計算)• 複数の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のインストールと動作確認

Windows Subsystem for Linux• Windows 10には、WSLという仕組みがあり、それを使うと簡単にLinuxがインストールできる• WSL1かWSL2、どちらかを選びUbuntuというLinusをインストールしてみようWSL1 -1
1. コントロールパネルをひらく
1. スタートボタン
2. Windowsシステムツール

2. プログラムをクリック

WSL1 -2

1. 「Windowsの機能の有効化または無効化」を選択
2. 「Linux⽤Windowsサブシステム」をチェック
3. OKを押して、再起動などの指⽰に従う

WSL1 -3

1. Microsoft StoreでUbuntuを検索し、⼊⼿、インストールする
2. パスワードを⼊れたりす
るとしばらくするとインストールが完了する

WSL2 -1
https://docs.microsoft.com/ja-jp/windows/wsl/install-win10を参考にインストールしてみる「LINUX⽤サブシステム」と「仮想マシンプラットフォーム」をチェックし、OK。再起動等

WSL2 -2

• LINUXカーネル更新プログラムのインストール
https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi

これをダウンロード、実⾏

WSL2 -3

• Windows Power Shellを管理者として実⾏しwsl␣--set-default-version␣2⏎

WSL2 -4
• WSL1と同様にストアでubuntuを検索、インストールする

起動して、ユーザー名パスワードを設定

WSL2 -5
• Power Shellでバージョンを確認
wsl␣–l␣-v ⏎確かに、Version 2になっている

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

X11のアプリ• X11のアプリを使うためにVcXsrv Windows XserverというWindows⽤ソフトをインストールする。

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

sudo apt install x11-apps

Xのアプリ(WSL1) -2

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

Xのアプリ(WSL2) -1
VcXsrv Windows X Serverの起動時にここにチェックを⼊れる

Xのアプリ(WSL2) -2
以下をUbuntuのWindowで⼊⼒
export DISPLAY=$(cat /etc/resolv.conf | grep nameserver| awk '{print $2}'):0.0

WSL2のXについては、いろいろなサイトを⾒て回りました。
例えば、
https://github.com/microsoft/WSL/issues/4106#issuecomment-501885675

Xのアプリ(共通) -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の編集(WSL1)• displayもmpirunもubuntu起動時に設定したい• .bashrcに付け加えることで実現できる

DISPLAYやmpirunのあたりのことを.bashrcに書いてしまう.bashrcの編集(WSL2)• displayもmpirunもubuntu起動時に設定したい• .bashrcに付け加えることで実現できる

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

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