このシリーズの記事は、MPIを使用した並列プログラミングに関するものです。
-
パート2。MPI-プロセスを監視することを学ぶ。
前回の記事では、プログラムの実行方法、MPIとは何か、MPIなしで記述できる場合にこの並列プログラミングが必要な理由について説明しました。この記事では、読者が前の記事で提示された資料を読み、MPIテクノロジ、つまりプロセス制御を研究する次のステップに進むことを前提としています。経験豊富なプログラマーの憤慨を避けるために、私はさらに「スレッド」、「プロセス」などを意味します。プログラムの特定のインスタンスが実行されているコンピューティングシステムの一部(この部分は、特定のスレッドまたはシステムの任意のコンピューティングノードのいずれかです)。
プロセス数とプロセスの総数
並列プログラムを構築するときに有用なアクションを実行するには、計算ノードとスレッドの間で役割を分散する必要があります。これを行うには、実行中のプログラムの特定のインスタンスをどのスレッドが処理しているかを知ることが重要ですが、最初に、実行中のスレッドの数を知っておくと便利です。
プログラムが実行されているスレッドを見つけるために、プロシージャMPI_Comm_sizeがあります。コミュニケータを入力として受け入れ(後で説明します)、整数が書き込まれるメモリアドレス、つまりプログラムを処理するスレッドの数を受け入れます。
int MPI_Comm_size(MPI_Comm comm, int* size)
? , , . , , . MPI , MPI_COMM_WORLD. , , .
, . MPI_Comm_size. , . :
int MPI_comm_rank(MPI_Comm comm, int* rank)
.
2 , , .
#include <stdio.h>
#include "mpi.h"
int main(int argc, char **argv)
{
int rank, size;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Finalize();
printf("Process: %d, size: %d\n", rank, size);
return 0;
}
5 :
Process: 0, size: 5
Process: 1, size: 5
Process: 2, size: 5
Process: 3, size: 5
Process: 4, size: 5
.
? , . , , , , .. , .
Comm_size, Comm_rank
. .
#include <stdio.h>
#include "mpi.h"
int main(int argc, char **argv)
{
const int MAX = 20;
int rank, size;
int n, ibeg, iend;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
n = (MAX - 1) / size + 1;
ibeg = rank * n + 1;
iend = (rank + 1) * n;
for(int i = ibeg; i <= ((iend > MAX) ? MAX : iend); i++)
{
printf("Process: %d, %d^2=%d\n", rank, i, i*i);
}
MPI_Finalize();
return 0;
}
5 :
Process: 0, 1^2=1
Process: 0, 2^2=4
Process: 0, 3^2=9
Process: 0, 4^2=16
Process: 1, 5^2=25
Process: 1, 6^2=36
Process: 1, 7^2=49
Process: 1, 8^2=64
Process: 2, 9^2=81
Process: 2, 10^2=100
Process: 2, 11^2=121
Process: 2, 12^2=144
Process: 3, 13^2=169
Process: 3, 14^2=196
Process: 3, 15^2=225
Process: 3, 16^2=256
Process: 4, 17^2=289
Process: 4, 18^2=324
Process: 4, 19^2=361
Process: 4, 20^2=400
MAX=20. , , .
, , , : . MPI , , .
, , , - . , , . MPI_Init, , , , - , . .
. MPI <time>, .
double MPI_Wtime(void);
double MPI_Wtick(void);
, . , , . , Wtime , .
, MPI_WTIME_IS_GLOBAL, 0 1, .
.
. MPI_Get_processor_name. :
int MPI_Get_Processor_name(char* name, int* len);
.
MPI, . .
知識を統合するために、1からNまでの所定の範囲の数に対して素数であるかどうかを認識する簡単なプログラムを作成することをお勧めします。これにより、このテクノロジーを使用して計算を並列化することがいかに簡単でシンプルであるかが明確に示され、習得したすべてのスキルを頭に入れることができます。
Khabravitesとこの記事に外から出くわした人々、すべての楽しい時間。