理論
最初から始める
最初は、並列コンピューティング用の単一の標準(API)はなく、プログラマーは各クラスターにアーキテクチャー固有のコードを作成する必要がありました。 しかし、ご存知のように、プログラマーは合理的な人々であり、標準を編成することがすぐに決定されました(最も有名なのはMPI 、OpenMPです)。
MPI-メッセージパッシングインターフェイス。 これは、1バイトのソースコード(!)を変更することなく、クラスターからクラスターにプログラムを簡単に転送するためにクラスターメーカーが実装する特定のAPIです。
並列プログラムでは、計算能力と通信環境を十分に活用する必要があります。 MPIでは、ノードとネットワークに負荷を分散する作業はすべてプログラマーが行います。最大のパフォーマンスを得るには、特定のクラスターの機能を知る必要があります。 MPIはネットワークトポロジの問題を非常にエレガントに解決します:コミュニケーターの概念があります-ネットワークトポロジに従って番号を付けることができるプロセスのグループ(このために、グリッドからハイパーキューブまでのトポロジを指定できるMPI_Cart_create関数が使用されます)。
並列化の実現可能性
教科書のいくつかの例は非常に合成的です-それらは標準タイプ(たとえば、double)内のいくつかのシリーズをカウントします。実際には、ネットワーク上の何かの初期化と転送(piの数の計算)ギガビットイーサネットを搭載した2台のコンピューターでの倍は、1台のコンピューターでの計算の約2倍遅い ただし、MPIではマルチコアプロセッサ(何らかの理由で多くの人が忘れています)の使用が許可されており、コア間の転送速度はまったく異なる順序であるため、システムのアーキテクチャとトポロジを常に把握する必要があります 。
練習する
理論について多くのことを書くことができますが、実践に比例して理論を理解することをお勧めします。
まず、コンピューターに何らかのMPI実装をインストールします。 MPIの最も一般的な実装の1つはMPICH( MPI Chameleon )です。
設置
ubuntでは、1行でインストールされます。
sudo apt-get install mpich2
何も役に立たないシンプルな小さなプログラムを書きましょう:
#include <stdio.h>
#include <mpi.h>
int main ( int argc, char* argv[])
{
int errCode;
if ((errCode = MPI_Init(&argc, &argv)) != 0)
{
return errCode;
}
int myRank;
MPI_Comm_rank(MPI_COMM_WORLD, &myRank);
if (myRank == 0)
{
printf( "It works!\n" );
}
MPI_Finalize();
return 0;
}
* This source code was highlighted with Source Code Highlighter .
このプログラムをコンパイルします。
mpicc -o test.bin ./test.c
実行してみましょう:
mpirun ./test.bin
(まだmpdデーモンを構成していない場合)、mpdデーモンが実行されていないというメッセージが表示されます。
mpiexec: cannot connect to local mpd (/tmp/mpd2.console_valery); possible causes:
1. no mpd is running on this host
2. an mpd is running but was started without a "console" (-n option)
In case 1, you can start an mpd on this host with:
mpd &
and you will be able to run jobs just on this host.
For more details on starting mpds on a set of hosts, see
the MPICH2 Installation Guide.
mpdを起動しようとすると、設定がないと言われます(実際、デーモンが起動しない理由)
configuration file /home/valery/.mpd.conf not found
A file named .mpd.conf file must be present in the user's home
directory (/etc/mpd.conf if root) with read and write access
only for the user, and must contain at least a line with:
MPD_SECRETWORD=<secretword>
One way to safely create this file is to do the following:
cd $HOME
touch .mpd.conf
chmod 600 .mpd.conf
and then use an editor to insert a line like
MPD_SECRETWORD=mr45-j9z
into the file. (Of course use some other secret word than mr45-j9z.)
秘密の単語は、ノードの接続にのみ必要です。 さらにコンピューターを接続する場合は、MPICHをコンピューターにインストールする必要があり、ノードのリストにノードを追加する必要があり、キーを使用して(ノードと通信するために)sshを介して接続を構成する必要はありません。
すべてが正しく行われた場合、およそ次の結論が得られます。
$ mpirun ./test.bin
It works!
MPI_Init-MPIライブラリを初期化するため、呼び出す必要があります。
MPI_COMM_WORLD-すべてのプロセスを含むグローバルコミュニケーターの識別子。
MPI_Comm_rank-指定されたコミュニケーター内のプロセスの識別子(番号、ランク)を返します。
なぜ0に等しいランクでのみ表示するのですか? このプロセスは、デフォルトで、起動元の端末のコンソールにアクセスできるプロセスに対応しているだけです。 他のものも使用できますが、より便利です。
出力の代わりに
並列プログラミングの知識がほとんどなくても並列プログラムを作成できますが、効果的なプログラムの作成は、アルゴリズムの選択と実装、システムへの適合などの時間のかかるプロセスです。 しかし、単純なプログラムの作成を開始し、同時にコンピューティングシステム(アーキテクチャ、通信環境など)に関する仕様と文献を読むと、時間が経つにつれて、%username%のように、リストにあるような恐ろしいマシンでさえ征服できるようになりますトップ500