Parte 2. MPI - Aprendiendo a monitorear procesos

Esta serie de artículos trata sobre la programación paralela usando MPI .





  • Parte 1. MPI - Introducción y primer programa.





  • Parte 2. MPI - Aprendiendo a monitorear procesos.





En el artículo anterior, discutimos cómo ejecutar un programa, qué es MPI y por qué se necesita esta programación paralela si puede escribir sin ella. En este artículo, asumimos que el lector ha leído el material presentado en el anterior y pasa al siguiente paso en el estudio de la tecnología MPI , a saber, el control de procesos. Para evitar la indignación de los programadores experimentados, también me referiré a "hilos", "procesos", etc. una parte de un sistema informático en el que se ejecuta una instancia específica de un programa (esta parte puede ser un hilo específico o cualquier nodo informático del sistema).






Números de proceso y número total de procesos

Para realizar acciones útiles al construir un programa paralelo, es necesario distribuir roles entre nodos computacionales e hilos. Para hacer esto, es simplemente vital para nosotros saber qué subproceso está procesando una instancia particular del programa que se ejecuta en él, pero para empezar, sería bueno saber cuántos de ellos se están ejecutando.





Para saber en qué hilo se está ejecutando el programa, existen procedimientos MPI_Comm_size . Acepta como entrada un comunicador (de él hablaremos más adelante), y la dirección de memoria donde se escribirá un entero , es decir, la cantidad de hilos que procesan el 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 los conocimientos Le sugiero que escriba un sencillo programa que reconoce si un número es primo de los números en un rango predeterminado de 1 a N . Esto le mostrará claramente lo fácil y simple que es paralelizar los cálculos utilizando esta tecnología y le permitirá poner todas las habilidades adquiridas en su cabeza.





Todo un momento agradable del día, los khabravitas y los que se encontraron con este artículo desde fuera.








All Articles