【mpich】Fatal error in MPI_Init_thread:で困った話（Mac編）

###エラー
MPI実装をmpichで行おうとしたら、以下のようなエラーが発生しました。

```python:
Fatal error in MPI_Init_thread: Invalid group, error stack:
MPIR_Init_thread(586)..............:
MPID_Init(224).....................: channel initialization failed
MPIDI_CH3_Init(105)................:

MPID_nem_init(324).................:
MPID_nem_tcp_init(175).............:
MPID_nem_tcp_get_business_card(401):
MPID_nem_tcp_init(373).............: gethostbyname failed, hostname (errno 0)
(unknown)(): Invalid group
```
昨日、大学の図書館では全く問題なかったのですが、私用しているポケットWifiを使用したらこのようなエラーが出てしまいました。コードはなにも変えていなかったのでびっくりです、、

この記事ではこのエラーを解決するために行った作業を記載しました。

###調べる

ということで`Fatal error in MPI_Init_thread:`をネットで調べると、stackoverflowにて

[MPICH2 gethostbyname failed](https://stackoverflow.com/questions/23112515/mpich2-gethostbyname-failed)

という記事を発見しました。どうやら`gethostbyname failed, hostname`部分に問題があるとのことでした。

記事によるとsshによる接続を行うと解決したそうです。ssh(Secure Shell)とは自分のPCから他のPC（主にサーバー）へ接続して、操作することを指します。sshはターミナルにコマンドを入力することによって操作することができます(コマンドは後述)。今回は他のPCではなく、自分のPCを対象としてsshの接続を行います。

また、sshの接続をするに当たって、hostファイルの書き換えを行う場面があります。hostファイルはIPアドレスとコンピュータを関連付けるためのファイルでこのファイルに必要な操作をして、自分のコンピュータへのアクセスを有効にします。IPアドレスはコンピュータに付けられた固有の番号のようなものです。(自分のPCのIPアドレスを調べるためには[Mac - IPアドレスを確認する方法](https://pc-karuma.net/mac-ip-address/)で調べることができます)

###1.PCのホスト名を変更

まずコンピュータのホスト名を変更する操作をします。
システム環境設定>共有
を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582794/6b23d978-3e74-e510-50eb-04b29fe574b7.png)
このコンピュータ名(黄色枠線)を変更します。

usernameをsunachackに書き換えてreturnキーを押し、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582794/6999613c-b412-348b-0627-5c0d551b6fff.png)
と変更することができました。コンピュータ名とその下にあるsunachack.localの部分が変更されていることがわかります。これでコンピュータの操作は終わりです。

念のためにターミナルも確認します。（今の時点でターミナルを起動している場合は開き直してください）

ターミナルを起動して次のように打ちます。
`scutil --get ComputerName`
`scutil --get LocalHsotName`
`scutil --get HostName`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582794/522a4897-efbe-6d51-6c20-c3c5c8819e46.png)
@の後に`sunachack`(黄色下線)と名前が変更されていればOKです。もし変更されていなければ再起動が必要かもしれないです。(僕は再起動して名前がちゃんと変わりました)

また、`ComputerName`と`LocalHostName`からも`sunachack`に変更されていることがわかります。(`HostName`は`not set`のままで問題ありません)

さらにリモートログインの項目にチェックをしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582794/1ec07d37-08bf-f66e-252b-5fff3552b943.png)
###2.hostファイルへの書き込み
次はhostファイルに書き込みを行います。ターミナルに`cat /etc/hosts`と打つと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582794/05d3191e-f782-8f08-591c-c3afa604f213.png)
のように表示されるはずです。
ここでは例えば、127.0.0.1と言うIPアドレスとlocalhostと言うホスト名が関連付けられています。

ではこのファイルに書き込みを行います。

`sudo nano /etc/hosts`と打ち、PCを開く際のパスワードを入力して

`127.0.0.1       sunachack.local`
`000.000.000.000 sunachack`

を挿入します。ここで、`000.000.000.000`はIPアドレスを指します。(IPアドレスは[Mac - IPアドレスを確認する方法](https://pc-karuma.net/mac-ip-address/)で調べることができます)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582794/bfed04ce-5516-449a-539e-57ae5ccbc598.png)
挿入したら^XでExitします。その際に保存するかを聞かれるのでYesと答えましょう。

再び`cat /etc/hosts`と打つと`127.0.0.1 sunachack.local`、`000.000.000.000 sunachack`が挿入されていることが確認できます。

最後に`ssh XXX@sunachack`と打ち、パスワードを入力して次のような表示があれば、うまくいった証拠です！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582794/7ea67e20-611d-afc7-493a-b5cf4f8170ce.png)

これでMPI実装を行うと、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582794/a4598ad4-72b6-12f8-b8bf-d799cae39e22.png)
無事実行されました！

###補足
途中で`ping`コマンドを打つことでも`ssh`コマンドがうまく機能しているかがわかります。
`ping`はネットワークの正常性を確認するためのコマンドです。
`ssh XXX@sunachack`コマンドが正しく機能していれば、`ping -c 10 sunachack`
というコマンドがエラーなく実行されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582794/0c4ff438-6692-83d6-fe13-dc489ca494a4.png)
逆に`ping -c 10 sunachack`がエラーとなってしまう場合はどこかのコマンドがうまく実行されていない可能性があります。

##追記
後日別のWifi環境で問題ないかを`ping`コマンドを使ってみると、問題が発生していることに気がつきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582794/5ced4c4e-7e99-b1c6-aef8-a366be2f1f61.png)
`packet`が全く受け入れられていない！

調べてわかったことは別のWifi環境でやると、IPアドレスが変ってしまい、sshによる接続を行うことができなくなっていました！

これに対処するために、再びhostファイルに書き込みを行いました。

しかし、以下の方法は別のWifi環境のIPアドレスをさらに書き込むことで、それぞれのIPアドレスに対応しようというものなので非常に非効率だと思います。また、僕の場合は使うWifiのIPアドレス自体は固定されていたので、もし同じWifi環境を使っているけどIPアドレスが変ってしまう場合はこの方法は使えないと思います。

他のやり方がある場合は教えていただきたいです。

###行った対処方法
 新たなWifi環境のIPアドレスを調べて、`sudo nano /etc/hosts`コマンドにてそれを書き込みます。また、現在使っていないWifiのIPアドレスを#で無効化します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582794/966ac686-920a-33ef-4f33-528ffb5d2874.png)
これで`ping`コマンドを再び実行すると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582794/9165cbd2-1d19-6843-d21a-ec7504e81642.png)
とうまくいきました。

もっと別のいい方法を見つけて再チャレンジしたいです！
ありがとうございました。