#author("2022-12-01T05:59:09+00:00","","")
#author("2022-12-01T06:00:18+00:00","","")
[[卒研1での技術習得 中市]]
*目次 [#z96c75e6]

#CONTENTS
*目的 [#c6533a8e]
並列分散でプログラムを高速にする
--
*VirtualBoxのインストールはこちら[#va3949fc]
https://www.oracle.com/jp/virtualization/technologies/vm/downloads/virtualbox-downloads.html
----
**[[CentOSを一からインストールしたい方はこちら>CentOSインストール]] [#bb9d0acd]
----
**CentOS作業 [#g5c34cc2]
CentOSがインストールされているものとする.(実験で使った?からあるはず)

画面左上の「アプリケーション」から「端末」を開く.(お気に入りに「端末」がなければシステムツールにある)

#ref(zu1.png,,40%)

まず,sudoが正常に機能するか確認するために
 sudo echo test
と入力.tpuのパスワードが要求されるので,パスワード「tpu」を入力する.「test」と表示されていればOK.

&color(red){以下のエラーが出たとき};

''sudoercファイル内にありません。この事象は記録・報告されます。''と出た時は,
 su
 usermod -G wheel tpu
 su tpu
と入力すると,sudoが機能するようになる.

***vimのコマンド [#s33f450a]
これから使用するvimというエディターについて.「通常モード」と「挿入モード」があり,''書き加える場合は基本的に「挿入モード」でしかできない''ので,以下の表のコマンドを使いこなす必要がある.
#ref(zu2.png,,40%)
&color(red){「挿入モード(文字入力モード)」から「通常モード」にするには''「Esc」キー''を押す.};

すぐ確認できるように写真に撮るなど残しておくことをオススメする.

***SELinuxの無効化設定 [#ef7b1bdf]
無効化する理由は、プログラムが動かなくなったり,インストールできなくなるからである.
 sudo vim /etc/selinux/config
と入力すると,
#ref(zu3.png,,70%)
図のようになるので,''vimのコマンド''を使い「挿入モード(文字入力モード)」にする.(aかiを押せば「挿入モード」になる)

''SELINUX=enforcing''をコメントアウト(先頭に''#''をつけるとコメントアウト)し,最後の行に
 SELINUX=disabled
と入力し,「通常モード」にし(''Escキー''),&color(red){ファイルを保存};して終了する.(ファイルの保存は「'':wq''」←通常モードのときにそのまま打ってよい)

&color(red){E45のエラーが出た(読み取り専用になってて編集できない)とき}; &br;
 :w !sudo tee %
を入力して、「続けるにはENTERを押すかコマンドを入力してください」と出るのでENTER &br;
そのあと
 :q!
を押して編集を終了する。(参考:https://genchan.net/it/server/14445/) &br;
&color(red){E45のエラーが出た(読み取り専用になってて編集できない)ときおわり};&br;


手動でもSELinuxを停止する.
 sudo setenforce 0
と入力.次にSELinuxの動作状態を確認する.
 getenforce
と入力.「Permissive」か「Disabled」と表示されていればOK.ダメな場合は無効化手順をもう一度実行してみる.

***ファイアウォールの無効化 [#gbcd2172]
 sudo systemctl disable firewalld
 sudo systemctl stop firewalld
と入力.
ファイアウォールが停止したか確認する.
 systemctl status firewalld
と入力.「Active:inactive(dead)」と表示されていればOK.

***JavaJDK,Mpich,C言語のインストール [#qe649f90]
 sudo yum -y install java-1.8.0-openjdk-devel mpich mpich-devel gcc-c++ openssl-devel
と入力.
インストールが終わり,''完了しました!''と表示されていればOK.

.bashrcのファイルを変更し,bash環境の設定を変更する.
 vim .bashrc
と入力.ファイルの最後に
 export JAVA_HOME=/usr/lib/jvm/jre-1.8.0.-openjdk
を追加し&color(red){ファイルを保存};して終了する.←vimのコマンド

.bashrcのファイルの変更を反映するために
 source .bashrc
と入力.

***IPアドレスの設定 [#w7865e65]
 nmcli con mod enp0s3 ipv4.method manual ipv4.addresses 192.168.11.XXX/24
と入力(''XXXの部分は学籍番号の下3桁にする'').
1915077の場合は192.168.11.77となる
>&color(red){注意};~
このとき、192.168.0.1は使わない.

 nmcli con mod enp0s3 ipv4.gateway 192.168.11.1
 nmcli con down enp0s3
 nmcli con up enp0s3
と入力.設定したIPアドレスで動作しているか確認する.
 nmcli device show enp0s3
と入力.確認したら「''Ctrl+C''」で抜ける.
#ref(zu4.png,,40%)

マスターPCに通信できるか確認する.
 ping 192.168.11.200(master0の場合)
 ping 192.168.11.201(master1の場合)
 ping 192.168.11.202(master2の場合)
 ping 192.168.11.203(master3の場合)
と入力.

以下のように表示されていれば通信できている(master1の場合)。 &br;
PING 192.168.11.201 (192.168.11.201) 56 (84) bytes of data. &br;
64 bytes from 192.168.11.201: icmp_seq=1 ttl=64 time=0.111 ms &br;
64 bytes from 192.168.11.201: icmp_seq=2 ttl=64 time=0.156 ms ・・・ &br;

表示されていなければ,~
・LANケーブルが接続されているか確認してみる~
・再起動してみる

***ホスト名の設定 [#b2cd5b53]
''XXX''はIPアドレス設定した番号を入力する.1915077の場合,slave77となる.
 sudo hosstname slaveXXX
 echo "slaveXXX" | sudo tee /etc/hostname > /dev/null
 hostname
と順に入力.「slaveXXX」と表示されていればOK.

次に,IP番号とホスト名を対応させるために,/etc/hostsファイルを編集する.
 sudo vim /etc/hosts
と入力.

WWはmasterのIPアドレス、Wはmaster番号、XXXは自分の学籍番号下2桁、YYY以降は他の人の学籍番号下2桁を入力していく。

既にある行はそのままで、その後に以下の行を追加する.
 192.168.11.20WW masterWW 
 192.168.11.XXX slaveXXX
 192.168.11.YYY slaveYYY
 …
並列処理で使うPC分入力する.

&color(red){E45のエラーが出た(読み取り専用になってて編集できない)とき}; &br;
 :w !sudo tee %
を入力して、「続けるにはENTERを押すかコマンドを入力してください」と出るのでENTER &br;
そのあと
 :q!
を押して編集を終了する。(参考:https://genchan.net/it/server/14445/)&br;

&color(red){E45のエラーが出た(読み取り専用になってて編集できない)ときおわり};&br;
下図は例である。
#ref(zu5.png,,40%)

***sshの設定 [#m1751ac3]
以下のコマンドをmaster側で入力する。
 ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa
 ssh-copy-id -i ~/.ssh/id_rsa.pub -o "StrictHostKeyChecking no" master0
 sshpass -p "tpu" ssh-copy-id -i ~/.ssh/id_rsa.pub -o "StrictHostKeyChecking no" master0
 sshpass -p "tpu" ssh-copy-id -i ~/.ssh/id_rsa.pub -o "StrictHostKeyChecking no" slaveXXX

>&color(red){↑slaveの台数分実行};

動かないとき
 ssh-add ~/.ssh/id_rsa

マスターPCとスレーブPCでsshできることを確認する.(WWWは通信するmasterの番号、XXXは自分のslaveの番号)
 ssh masterWWW(slaveXXX)
と入力.sshを抜けるときは
 exit
と入力.

***masterPCの初期設定(Mpichをダウンロードした後一度だけ必要,もうできていると思うのでやる必要はない。) [#j30a980c]
共有ディレクトリの作成
 mkdir /home/tpu/share
と入力.

共有ディレクトリの設定
 sudo vim /etc/export
と入力.以下を最後の行に追加する.
 /home/tpu/share 192.168.0.0/24(rw,no_root_squash)

ドメイン名の設定
 sudo vim /etc/idmapd.conf
と入力.

Domainのコメントアウトを外す.
#ref(n5.PNG,,40%)

***マウント [#gf695941]
マウントとは,slavePCでmasterPCの特定のフォルダを操作・利用可能にすること.

slaveからmasterPCに通信できるか確認する
 ping master0

slavePCがmasterPCをマウントできるように''masterPC''で
 sudo systemctl start rpcbind
 sudo systemctl start nfs-server
 sudo systemctl start nfs-lock
 sudo start nfs-idmap
 sudo systemctl enable nfs-server
 sudo systemctl reload nfs-server
と入力.

自分のPCに戻り、exitでshhを解除しマスター側の共有ディレクトリをマウントするディレクトリを、以下のコマンドで作成する。(既に存在しますと表示されればスキップ)
 $ mkdir /home/tpu/share

slave側で、以下のコマンドを打ってマウントする。( X : 使っているmaster番号 ) &br;
slave側で操作する必要があるため、[tpu@slaveXX]になっているか確認する
 $ sudo mount --types nfs masterX:/home/tpu/share /home/tpu/share

&color(red){T-x. access deniedの場合}; &br;
「mount.nfs: access denied by server while mounting masterX:/home/tpu/share」と出る場合、
以前の実験のmount情報が残っているため、master側のshareフォルダの名前を変更し(2など)、
新しいshareフォルダを作成する(mkdir /home/tpu/share)

&color(red){T-x.(終わり)}; &br;
以下のコマンドで確認し、
 $ df –k
一番下に次のように表示されればいい
 192.168.11.20X:/home/tpu/share   430897664   847872 430049792    1%/home/tpu/share

slave側で以下のコマンドで共有ディレクトリを作成するためにfstabファイルを編集する。
 $ sudo vim /etc/fstab
最後の行に以下を追加する。「share」の後は改行せずスペースだけ。
 192.168.11.20X:/home/tpu/share /home/tpu/share 
 nfs rsize=8192,wsize=8192,hard,intr 0 0

確認方法は、以下のコマンドを入力し
 $ sudo umount /home/tpu/share
 $ sudo mount –a
 $ df –k

一番下につぎのようにでればいい。
 192.168.11.20X:/home/tpu/share   430897664   847872 430049792    1% /home/tpu/share

&color(red){T-y. マウント時のエラー対処}; &br;
(1)「mount -a」の応答が帰ってこないslaveがある場合、59のnfsを再実行&br;
→59の一部ができなくなっているときは間違えてmasterのfstabを62で書き換えてしまった可能性があるので、元に修正&br;
(2) 後のshareフォルダで別masterのマウントが判明した場合&br;
・63「umount」でマウント解除&br;
・それでも「master is busy」と出る場合は、slaveの仮想マシンを再起動する&br;
→デスクトップのshareがなくなり解除される&br;
&color(red){T-y.(終わり)}; &br;

***並列分散の設定 [#j30a980c]
マスターPCにSSHで接続する。
 $ ssh masterX 

hostファイルを書き換える(マスターPCにSSH接続したまま)。&br;
このhostファイルの中に記述されているPCを用いて並列処理が行われる&br;
並列したいpcを変更したいときslaveの番号を変える。または増やす

 →Xは自分が接続するmaster番号,YYは学籍番号下2桁
 $ sudo vim /home/tpu/share/host
 masterX
 slaveYY


*sapmleプログラムの実行方法[#va3949fc]
masterのpcの共有ディレクトリのshareの中にmontecarlo.cがあるのでそれをコピーして貼り付けて、
名前をmontecarloXX.c(XXは学籍番号下2桁)に変える。(これはmaster側のpcで直接コピペする)&br;

slave側のpcで、sshでmasterに接続した状態で以下のコマンドで共有フォルダに移動する。

 $ cd /home/tpu/share

次に、以下のコマンドでファイルをコンパイルする(XXは学籍番号下2桁。さっきコピペしたものと同じプログラムをコンパイルする場合)
 $ mpicc montecarloXX.c -o montecarloXX -lm 

以下のコマンドで実行するとプログラムが実行する。実行する場合はほかの人と同時に実行しないこと。(XXは学籍番号下2桁)

 $ mpirun --hostfile host -np 1 ./montecarloXX 

-npの後の数字で、使うPCの数が決まる。つまり、-np 2だと2台,-np 1だと1台で実行される。

***サンプルプログラムの結果の見方[#va3949fc]
piがモンテカルロ法によって導き出された円周率の値で、Errorが正確な円周率の値との差が表示されている。そして、timeが求めるまでかかった時間を表す。

#ref(zu6.png,,70%)

*課題[#va3949fc]
モンテカルロ法によって円周率を求めるプログラムを、1台、2台、3台、6台で行い、各処理にかかった時間を記入する。
#ref(20.png,,70%)
*参考にしたもの[#va3949fc]
よくわからなかったらこちらを参考にしてください。↓ &br;
#ref(mpichによる分散処理.pdf)

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS