Esta série de artigos é sobre programação paralela usando MPI .
Parte 1. MPI - Introdução e o primeiro programa.
Parte 2. MPI - Aprendendo a monitorar processos.
No artigo anterior, discutimos como executar um programa, o que é MPI e por que essa programação paralela é necessária se você pode escrever sem ela. Neste artigo, presumimos que o leitor tenha lido o material apresentado no artigo anterior e prossiga para a próxima etapa no estudo da tecnologia MPI , ou seja, controle de processo. Para evitar a indignação de programadores experientes, vou me referir a "threads", "processos", etc. uma parte de um sistema de computação na qual uma instância específica de um programa está sendo executada (esta parte pode ser uma thread específica ou qualquer nó de computação do sistema).
Números de processos e número total de processos
Para realizar ações úteis ao construir um programa paralelo, é necessário distribuir funções entre nós computacionais e threads. Para fazer isso, é simplesmente vital sabermos qual thread está processando uma instância específica do programa em execução, mas, para começar, seria bom saber quantos deles estão em execução.
Para descobrir em qual thread o programa está sendo executado, existem os procedimentos MPI_Comm_size . Ele aceita um comunicador como entrada (falaremos sobre isso mais tarde), e o endereço da memória onde um inteiro será escrito , ou seja, o número de threads processando o programa.
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, . .
Para consolidar o conhecimento que eu sugiro que você escrever um programa simples que reconhece se um número é primo para os números em um intervalo pré-determinado a partir de 1 de de N . Isso mostrará claramente como é fácil e simples paralelizar cálculos usando essa tecnologia e permitirá que você coloque todas as habilidades adquiridas em sua cabeça.
Tudo uma hora agradável do dia, Khabravites e aqueles que se depararam com este artigo de fora.