Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

【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のホスト名を変更

まずコンピュータのホスト名を変更する操作をします。
システム環境設定>共有
を開きます。
image.png
このコンピュータ名(黄色枠線)を変更します。

usernameをsunachackに書き換えてreturnキーを押し、
image.png
と変更することができました。コンピュータ名とその下にあるsunachack.localの部分が変更されていることがわかります。これでコンピュータの操作は終わりです。

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

ターミナルを起動して次のように打ちます。
scutil --get ComputerName
scutil --get LocalHsotName
scutil --get HostName
image.png
@の後にsunachack(黄色下線)と名前が変更されていればOKです。もし変更されていなければ再起動が必要かもしれないです。(僕は再起動して名前がちゃんと変わりました)

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

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

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

次はhostファイルに書き込みを行います。ターミナルにcat /etc/hostsと打つと
image.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アドレスを確認する方法で調べることができます)
image.png
挿入したら^XでExitします。その際に保存するかを聞かれるのでYesと答えましょう。

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

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

これでMPI実装を行うと、
image.png
無事実行されました!

補足

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

追記

後日別のWifi環境で問題ないかをpingコマンドを使ってみると、問題が発生していることに気がつきました。
image.png
packetが全く受け入れられていない!

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

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

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

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

行った対処方法

新たなWifi環境のIPアドレスを調べて、sudo nano /etc/hostsコマンドにてそれを書き込みます。また、現在使っていないWifiのIPアドレスを#で無効化します。
image.png
これでpingコマンドを再び実行すると、
image.png
とうまくいきました。

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

sunachack
北海道在住の大学生です! 2020から研究室に入って、プログラミングを始めました。 脳科学に興味があり、今は強化学習の勉強をしています!
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away