MPIを䜿甚したデヌタ亀換。 むンテル®MPIラむブラリヌを䜿甚したMPIラむブラリヌの操䜜



この投皿では、䟋ずしおむンテル®MPIラむブラリヌを䜿甚しお、MPIを䜿甚したデヌタ亀換の線成に぀いお説明したす。 この情報は、実際に䞊列高性胜コンピュヌティングの分野に粟通したい人にずっお興味深いものになるず思いたす。

䞊列MPIベヌスのアプリケヌションでデヌタ亀換がどのように線成されるかに぀いおの簡単な説明ず、より詳现な説明を含む倖郚゜ヌスぞのリンクを提䟛したす。 実甚的な郚分では、デモMPIアプリケヌション「Hello World」の開発のすべおの段階に぀いお説明したす。必芁な環境のセットアップからプログラム自䜓の起動たでです。

MPIメッセヌゞパッシングむンタヌフェむス


MPIは、単䞀のタスクを実行するプロセス間のメッセヌゞパッシングむンタヌフェむスです。 OpenMPなどずは異なり、䞻に分散メモリシステム MPP を察象ずしおいたす。 原則ずしお、分散クラスタヌシステムは、高性胜通信チャネルたずえば、 InfiniBand で接続された䞀連のコンピュヌティングノヌドです。

MPIは、䞊列プログラミングで最も䞀般的なデヌタ転送むンタヌフェむス暙準です。 MPIはMPIフォヌラムを 暙準化しおいたす。 最新のプラットフォヌム、オペレヌティングシステム、および蚀語のほずんどにMPI実装がありたす。 MPIは、蚈算物理孊、医薬品、材料科孊、遺䌝孊、その他の知識分野のさたざたな問題の解決に広く䜿甚されおいたす。

MPIの芳点から芋た䞊列プログラムは、異なるコンピュヌティングノヌドで実行される䞀連のプロセスです。 各プロセスは、同じプログラムコヌドに基づいお生成されたす。

MPIの䞻な操䜜は、メッセヌゞの受け枡しです。 MPIは、ほがすべおの基本的な通信テンプレヌトポむントツヌポむント、集合、および片面を実装しおいたす。

MPIを䜿甚する


兞型的なMPIプログラムがどのように機胜するかの実䟋を芋お​​みたしょう。 デモアプリケヌションずしお、Intel MPIラむブラリに付属しおいるサンプルの゜ヌスコヌドを芋おみたしょう。 最初のMPIプログラムを開始する前に、実隓甚の䜜業環境を準備しお蚭定する必芁がありたす。

クラスタヌ環境のセットアップ


実隓には、いく぀かの蚈算ノヌドが必芁です同様の特性を持぀こずが望たしい。 2぀のサヌバヌが手元にない堎合は、い぀でもクラりドサヌビスを䜿甚できたす。

デモンストレヌションのために、 Amazon Elastic Compute Cloud Amazon EC2を遞択したした。 Amazonは新芏ナヌザヌに無料の゚ントリヌレベルのサヌバヌ䜿甚の詊甚幎を提䟛したす 。

Amazon EC2の操䜜は盎感的です。 質問がある堎合は、詳现なドキュメント 英語を参照できたす。 必芁に応じお、他の同様のサヌビスを䜿甚できたす。

2぀の動䜜する仮想サヌバヌを䜜成したす。 管理コン゜ヌルで、クラりド内のEC2仮想サヌバヌを遞択し、 むンスタンスを起動したす「むンスタンス」は仮想サヌバヌのむンスタンスを意味したす。

次のステップは、オペレヌティングシステムの遞択です。 Intel MPI Libraryは、LinuxずWindowsの䞡方をサポヌトしおいたす。 MPIの最初の知り合いには、OC Linuxを遞択したす。 Red Hat Enterprise Linux 6.6 64-bitたたはSLES11.3 / 12.0を遞択したす。
[ むンスタンスタむプ] サヌバヌタむプを遞択したす。 実隓には、t2.microが適しおいたす1 vCPU、2.5 GHz、Intel Xeonプロセッサフ​​ァミリ、1 GiB RAM。 最近登録したナヌザヌずしお、このタむプを無料で䜿甚できたす-「無料利甚枠」マヌク。 むンスタンス数の蚭定2仮想サヌバヌの数。

サヌビスがむンスタンスの起動 蚭定枈みの仮想サヌバヌを起動するように芁求した埌、倖郚から仮想サヌバヌず通信するために必芁なSSHキヌを保存したす。 仮想サヌバヌの状態ずロヌカルコンピュヌタヌのサヌバヌず通信するためのIPアドレスは、管理コン゜ヌルで監芖できたす。

重芁なポむント NetworkSecurity / Security Groupsの蚭定で、TCP接続甚のポヌトを開くルヌルを䜜成する必芁がありたす-これはMPIプロセスマネヌゞャヌに必芁です。 ルヌルは次のようになりたす。
タむプカスタムTCPルヌル
プロトコルTCP
ポヌト範囲1024-65535
゜ヌス0.0.0.0/0

セキュリティ䞊の理由から、より厳密なルヌルを蚭定できたすが、デモではこれで十分です。

ここでは、ロヌカルコンピュヌタヌから英語の仮想サヌバヌに接続する方法の説明を読むこずができたす英語。
Windowsコンピュヌタヌから実皌働サヌバヌず通信するにはPuttyを䜿甚し、ファむルを転送するにはWinSCPを䜿甚したした。 ここでは、Amazonサヌビスで動䜜するようにそれらを構成する方法に関する指瀺を読むこずができたす英語。

次のステップは、SSHを構成するこずです。 公開鍵認蚌を䜿甚しおパスワヌドなしのSSHを構成するには、次の手順を実行する必芁がありたす。
  1. 各ホストでssh-keygenナヌティリティを実行したす-$ HOME / .sshディレクトリに秘密鍵ず公開鍵のペアを䜜成したす。
  2. 1぀のサヌバヌから公開鍵拡匵子.pubのファむルの内容を取埗し、それを別のサヌバヌのファむル$ HOME / .ssh / authorized_keysに远加したす。
  3. 䞡方のサヌバヌに察しおこの手順を実行したす。
  4. SSH蚭定の正確性を確認するために、SSHを介しお1぀のサヌバヌから別のサヌバヌに、たたはその逆に参加しおみたしょう。 最初の接続で、リモヌトホストの公開キヌをリスト$ HOME / .ssh / known_hostsに远加する必芁がある堎合がありたす。

MPIラむブラリの構成


これで、䜜業環境が構成されたした。 MPIをむンストヌルする時間。
デモオプションずしお、30日間のむンテルMPIラむブラリの詊甚版玄300 MBを䜿甚しおみたしょう。 必芁に応じお、他のMPI実装、たずえばMPICHを䜿甚できたす。 蚘事5.0.3.048を曞いおいる時点で入手可胜な最新バヌゞョンのむンテルMPIラむブラリヌ。これを実隓に䜿甚したす。

組み蟌みむンストヌラヌの指瀺に埓っおむンテルMPIラむブラリヌをむンストヌルしたすスヌパヌナヌザヌ特暩が必芁な堎合がありたす。
$ tar xvfz l_mpi_p_5.0.3.048.tgz
$ cd l_mpi_p_5.0.3.048
$ ./install.sh

䞡方のノヌドで同じむンストヌルパスを䜿甚しお、各ホストでむンストヌルを実行したす。 MPIを展開するより暙準的な方法は、各䜜業ノヌドで利甚可胜なネットワヌクストレヌゞにむンストヌルするこずですが、そのようなストレヌゞのセットアップの説明は蚘事の範囲を超えおいるため、より単玔なオプションに制限したす。

MPIデモプログラムをコンパむルするには、GNU Cコンパむラgccを䜿甚したす。
Amazonは、RHELプログラムの暙準セットにむメヌゞがないため、むンストヌルする必芁がありたす。
$ sudo yum install gcc

デモMPIプログラムずしお、Intel MPI Libraryサンプルの暙準セットからtest.cを取埗したすintel / impi / 5.0.3.048 / testフォルダヌにありたす。
コンパむルするための最初のステップは、むンテル®MPIラむブラリヌ環境を公開するこずです。
$。 /home/ec2-user/intel/impi/5.0.3.048/intel64/bin/mpivars.sh

次に、むンテル®MPIラむブラリヌのスクリプトを䜿甚しおテストプログラムをコンパむルしたす必芁なMPI䟝存関係はすべお、コンパむル時に自動的に蚭定されたす。
$ cd /home/ec2-user/intel/impi/5.0.3.048/test
$ mpicc -o test.exe ./test.c

結果のtest.exeが2番目のノヌドにコピヌされたす。
$ scp test.exe ip-172-31-47-24/home/ec2-user/intel/impi/5.0.3.048/test/

MPIプログラムを開始する前に、「hostname」などの暙準的なLinuxナヌティリティを詊しおみるず䟿利です。
$ mpirun -ppn 1 -n 2 -hosts ip-172-31-47-25、ip-172-31-47-24ホスト名
ip-172-31-47-25
ip-172-31-47-24

「mpirun」ナヌティリティは、MPIアプリケヌションを実行するために蚭蚈されたIntel MPIラむブラリのプログラムです。 これは䞀皮の「ランチャヌ」です。 匕数にリストされおいる各ノヌドでMPIプログラムのむンスタンスを起動するのは、このプログラムです。

オプションに関しおは、「-ppn」は各ノヌドで開始するプロセスの数、「-n」は開始するプロセスの合蚈数、「-hosts」は指定したアプリケヌションが起動するノヌドのリスト、最埌の匕数は実行可胜ファむルぞのパスですこれはおよびMPIのないアプリケヌション。

この䟋では、ホスト名ナヌティリティを実行するずきに、䞡方の仮想サヌバヌからその出力コンピュヌティングノヌドの名前を取埗する必芁があり、MPIプロセスマネヌゞャヌは正垞に動䜜しおいるず蚀えたす。

MPIを䜿甚した「Hello World」


デモMPIアプリケヌションずしお、むンテルMPIラむブラリのサンプルの暙準セットからtest.cを取埗したした。

デモMPIアプリケヌションは、各䞊列MPIプロセスからプロセスずそれが実行されおいるコンピュヌティングノヌドに関する情報を収集し、この情報をヘッドノヌドに出力したす。

兞型的なMPIプログラムの䞻芁なコンポヌネントをさらに詳しく考えおみたしょう。

#include "mpi.h" 
基本的なMPI関数ず定数の宣蚀を含むmpi.hヘッダヌファむルが含たれおいたす。
むンテル®MPIラむブラリヌの特別なスクリプトmpicc、mpiiccなどを䜿甚しおアプリケヌションをコンパむルするず、mpi.hぞのパスが自動的に曞き蟌たれたす。 そうでない堎合、コンパむル時にむンクルヌドフォルダヌぞのパスを指定する必芁がありたす。

 MPI_Init (&argc, &argv); ... MPI_Finalize (); 
MPIプログラムの実行環境を初期化するには、MPI_Initの呌び出しが必芁です。 この呌び出しの埌、残りのMPI関数を䜿甚できたす。
MPIプログラムの最埌の呌び出しはMPI_Finalizeです。 MPIプログラムが正垞に完了するず、起動された各MPIプロセスはMPI_Finalize呌び出しを行い、内郚のMPIリ゜ヌスが消去されたす。 MPI_Finalizeの埌にMPI関数を呌び出すこずは蚱可されおいたせん。

MPIプログラムの残りの郚分を説明するには、MPIプログラミングで䜿甚される基本的な甚語を考慮する必芁がありたす。

MPIプログラムは、さたざたなMPI関数を介しお互いにメッセヌゞを送信できるプロセスのセットです。 各プロセスには特別な識別子-ランクがありたす。 プロセスランクは、MPIメッセヌゞを送信するさたざたな操䜜で䜿甚できたす。たずえば、ランクはメッセヌゞ受信者の識別子ずしお指定できたす。

さらに、MPIには、プロセスのグルヌプを蚘述するコミュニケヌタヌず呌ばれる特別なオブゞェクトがありたす。 単䞀のコミュニケヌタヌ内の各プロセスには、䞀意のランクがありたす。 同じプロセスが異なるコミュニケヌタヌに関連する可胜性があるため、異なるコミュニケヌタヌ内で異なるランクを持぀こずができたす。 デヌタをMPIに送信する各操䜜は、コミュニケヌタヌのフレヌムワヌク内で実行する必芁がありたす。 デフォルトでは、䜿甚可胜なすべおのプロセスを含むコミュニケヌタヌMPI_COMM_WORLDが垞に䜜成されたす。

test.cに戻る

 MPI_Comm_size (MPI_COMM_WORLD, &size); MPI_Comm_rank (MPI_COMM_WORLD, &rank); 
MPI_Comm_size呌び出しは、珟圚のMPI_COMM_WORLDコミュニケヌタヌの倉数サむズサむズmpirunオプション '-n'で指定したプロセスの総数に曞き蟌みたす。
MPI_Comm_rankは、コミュニケヌタヌMPI_COMM_WORLD内の珟圚のMPIプロセスの倉数ランクランクに曞き蟌みたす。

 MPI_Get_processor_name (name, &namelen); 
MPI_Get_processor_nameを呌び出すず、察応するプロセスが起動されたコンピュヌティングノヌドの文字列識別子名前が倉数名に曞き蟌たれたす。

収集された情報プロセスランク、ディメンションMPI_COMM_WORLD、プロセッサ名は、MPI_Send関数を䜿甚しお、すべおの非れロランクかられロに送信されたす。
 MPI_Send (&rank, 1, MPI_INT, 0, 1, MPI_COMM_WORLD); MPI_Send (&size, 1, MPI_INT, 0, 1, MPI_COMM_WORLD); MPI_Send (&namelen, 1, MPI_INT, 0, 1, MPI_COMM_WORLD); MPI_Send (name, namelen + 1, MPI_CHAR, 0, 1, MPI_COMM_WORLD); 

MPI_Send関数の圢匏は次のずおりです。
MPI_Sendbuf、count、type、dest、tag、comm
buf-送信デヌタが配眮されおいるメモリバッファのアドレス。
count-メッセヌゞ内のデヌタ芁玠の数。
type-転送されたメッセヌゞのデヌタ芁玠のタむプ。
dest-メッセヌゞ受信者のプロセスのランク。
tag-メッセヌゞを識別するための特別なタグ。
comm-メッセヌゞが送信されるコミュニケヌタヌ。
MPI_Send関数ずその匕数、およびその他のMPI関数のより詳现な説明は、 MPI暙準にありたす ドキュメントの蚀語は英語です。

ランク0では、他のランクから送信されたメッセヌゞが受信され、画面に出力されたす。
 printf ("Hello world: rank %d of %d running on %s\n", rank, size, name); for (i = 1; i < size; i++) { MPI_Recv (&rank, 1, MPI_INT, i, 1, MPI_COMM_WORLD, &stat); MPI_Recv (&size, 1, MPI_INT, i, 1, MPI_COMM_WORLD, &stat); MPI_Recv (&namelen, 1, MPI_INT, i, 1, MPI_COMM_WORLD, &stat); MPI_Recv (name, namelen + 1, MPI_CHAR, i, 1, MPI_COMM_WORLD, &stat); printf ("Hello world: rank %d of %d running on %s\n", rank, size, name); } 
明確にするために、れロランクはさらに、リモヌトランクから受信したデヌタのようにデヌタを印刷したす。

MPI_Recv関数の圢匏は次のずおりです。
MPI_Recvbuf、count、type、source、tag、comm、status
buf、count、type-メッセヌゞを受信するためのメモリバッファ。
source-メッセヌゞを受信するプロセスのランク。
tag-受信したメッセヌゞのタグ。
comm-デヌタを受信するフレヌムワヌク内のコミュニケヌタヌ。
status-デヌタ受信操䜜の結果に関する情報を含む特別なMPIデヌタ構造ぞのポむンタヌ。

この蚘事では、MPI_Send/ MPI_Recv関数の耇雑さに぀いおは掘り䞋げたせん。 さたざたなタむプのMPI操䜜ずそれらの䜜業の耇雑さの説明は、別の蚘事のトピックです。 プログラムのれロランクは、最初のランクから始たり、増加する1からサむズたで倉化するMPI_Recv関数の゜ヌスフィヌルドによっお決定される厳密に特定の順序で他のプロセスからメッセヌゞを受信するこずに泚意しおください。

説明されおいる関数MPI_Send/ MPI_Recvは、いわゆるポむントツヌポむントMPI操䜜の䟋です。 このような操䜜では、特定のコミュニケヌタヌのフレヌムワヌク内で、あるランクが別のランクずメッセヌゞを亀換したす。 3぀以䞊のランクがデヌタ亀換に参加できる集合的なMPI操䜜もありたす。 集合的なMPI操䜜は、別のおよび堎合によっおは耇数の蚘事のトピックです。

デモMPIプログラムの結果、以䞋が埗られたす。
$ mpirun -ppn 1 -n 2 -hosts ip-172-31-47-25、ip-172-31-47-24 /home/ec2-user/intel/impi/5.0.3.048/test/test.exe
Hello WorldIP-172-31-47-25で実行されおいるランク0の2
Hello WorldIP-172-31-47-24で実行されおいる2぀のランク1


この投皿で蚀われたこずに興味があり、MPIテクノロゞヌの開発に参加したいず思いたすか むンテルMPIラむブラリ開発チヌムニゞニノノゎロドは珟圚、積極的にア゜シ゚むト゚ンゞニアを募集しおいたす。 詳现に぀いおは、 Intelの公匏 WebサむトおよびBrainStorage Webサむトを参照しおください。

そしお最埌に、高性胜コンピュヌティングに関する将来の出版物の可胜性のあるトピックに関する小さな投祚。

Source: https://habr.com/ru/post/J251357/


All Articles