【mpich】Fatal error in MPI_Init_thread:で困った話(Mac編)


エラー

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

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

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

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

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

1.PCのホスト名を変更

まずコンピュータのホスト名を変更する操作をします。
システム環境設定>共有
を開きます。

このコンピュータ名(黄色枠線)を変更します。

usernameをsunachackに書き換えてreturnキーを押し、

と変更することができました。コンピュータ名とその下にあるsunachack.localの部分が変更されていることがわかります。これでコンピュータの操作は終わりです。

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

ターミナルを起動して次のように打ちます。
scutil --get ComputerName
scutil --get LocalHsotName
scutil --get HostName

@の後にsunachack(黄色下線)と名前が変更されていればOKです。もし変更されていなければ再起動が必要かもしれないです。(僕は再起動して名前がちゃんと変わりました)

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

さらにリモートログインの項目にチェックをしておきます。

2.hostファイルへの書き込み

次はhostファイルに書き込みを行います。ターミナルにcat /etc/hostsと打つと

のように表示されるはずです。
ここでは例えば、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アドレスを確認する方法で調べることができます)

挿入したら^XでExitします。その際に保存するかを聞かれるのでYesと答えましょう。

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

最後にssh XXX@sunachackと打ち、パスワードを入力して次のような表示があれば、うまくいった証拠です!

これでMPI実装を行うと、

無事実行されました!

補足

途中でpingコマンドを打つことでもsshコマンドがうまく機能しているかがわかります。
pingはネットワークの正常性を確認するためのコマンドです。
ssh XXX@sunachackコマンドが正しく機能していれば、ping -c 10 sunachack
というコマンドがエラーなく実行されます。

逆にping -c 10 sunachackがエラーとなってしまう場合はどこかのコマンドがうまく実行されていない可能性があります。

追記

後日別のWifi環境で問題ないかをpingコマンドを使ってみると、問題が発生していることに気がつきました。

packetが全く受け入れられていない!

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

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

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

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

行った対処方法

新たなWifi環境のIPアドレスを調べて、sudo nano /etc/hostsコマンドにてそれを書き込みます。また、現在使っていないWifiのIPアドレスを#で無効化します。

これでpingコマンドを再び実行すると、

とうまくいきました。

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