Rangkaian artikel ini membahas tentang pemrograman paralel menggunakan MPI .
Bagian 1. MPI - Pendahuluan dan program pertama.
Bagian 2. MPI - Belajar memantau proses.
Pada artikel sebelumnya, kita telah membahas bagaimana menjalankan suatu program, apa itu MPI dan mengapa pemrograman paralel ini diperlukan jika Anda dapat menulis tanpa program tersebut. Pada artikel ini, kami berasumsi bahwa pembaca telah membaca materi yang disajikan sebelumnya dan melanjutkan ke langkah berikutnya dalam mempelajari teknologi MPI , yaitu pengendalian proses. Untuk menghindari kemarahan programmer berpengalaman, saya akan maksud lebih lanjut dengan "utas", "proses", dll. bagian dari sistem komputasi tempat instance tertentu dari suatu program berjalan (Bagian ini dapat berupa utas tertentu atau simpul komputasi apa pun dari sistem).
Jumlah proses dan jumlah proses
Untuk melakukan tindakan yang berguna saat membangun program paralel, perlu untuk mendistribusikan peran antara node komputasi dan utas. Untuk melakukan ini, sangat penting bagi kami untuk mengetahui utas mana yang memproses contoh tertentu dari program yang berjalan di atasnya, tetapi sebagai permulaan, alangkah baiknya mengetahui berapa banyak dari mereka yang berjalan sama sekali.
Untuk mengetahui di utas mana program ini berjalan, ada prosedur MPI_Comm_size . Ia menerima komunikator sebagai input (kita akan membicarakannya nanti), dan alamat memori tempat bilangan bulat akan ditulis , yaitu jumlah utas yang memproses program.
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, . .
Untuk mengkonsolidasikan pengetahuan saya sarankan Anda menulis sebuah program sederhana yang mengakui apakah suatu bilangan prima ke nomor dalam kisaran yang telah ditentukan dari 1 ke N . Ini jelas akan menunjukkan kepada Anda betapa mudah dan sederhananya untuk memparalelkan komputasi menggunakan teknologi ini dan akan memungkinkan Anda untuk menempatkan semua keterampilan yang diperoleh di kepala Anda.
Sepanjang hari yang menyenangkan, orang Khabrav dan mereka yang menemukan artikel ini dari luar.