Práctica 2: Fundamentos básicos de paralelización: Modelo de comunicación punto a punto Introducción Para realizar esta práctica, hemos hecho uso de las funciones MPI aplicadas a nuestros procesos en paralelo. Gracias a la teoría proporcionada y explicada hemos hecho uso de la comunicación bloqueante para poder realizar los ejercicios. Ejercicio 1 (6 puntos) Se pide implementar un programa usando MPI que simule el funcionamiento de un bingo a pequeña escala. Se contará con un fichero con números del 1 al 15 escritos en orden aleatorio (uno en cada línea y sin repetir). En este bingo podrán participar un máximo de 16 procesos siendo el proceso con rango 0 el locutor, y del 1 al 15 los jugadores. El funcionamiento del juego será el siguiente: Nada más empezar, el locutor dirá el número de participantes que hay, mientras que los jugadores deberán acceder al fichero y leer qué número les ha tocado en su cartón. El número asignado a cada proceso está en la misma línea que su rango. Mientras, el proceso 0 debe esperar a que se termine esta lectura. Tras esto, el proceso 0 empezará a mostrar por pantalla un número aleatorio entre 1 y 40 cada 1,5 segundos, y transmitiéndolo al resto de procesos. Los jugadores deberán esperar a recibir este mensaje, comprobarán el número con su cartón y, si no es el suyo se mantendrán a la espera de otro número mientras que, si es el suyo mostrarán por pantalla: “Bingo! Soy el proceso X y mi número es el Y”, siendo X el rango e Y el número de su cartón. Pese a cantar bingo, el juego seguirá funcionando de manera indefinida y seguirá habiendo más ganadores. 2 Este código es un programa que simula un juego de bingo con cartones para cada proceso de un único número. Primero comenzamos como de costumbre, inicializando nuestro entorno MPI y definiendo rango y numero de procesos. Para que funcione habrá que realizar una distinción entre el proceso 0 que será el locutor y los demás procesos que serán los jugadores. Para ello realizamos nuestro primer “if rango==0 y else”. 3 El proceso 0 genera el numero aleatorio que será el numero ganador del bingo y lo mostrará por pantalla cada 1,5 segundos. Usando la función `MPI_Bcast` transmitirá ese número a todos los otros procesos. Por el otro lado, nuestros procesos irán leyendo los números desde un archivo txt. Estos números serán con los que jugarán el bingo. Si el número del proceso coincide con el numero sorteado lo anunciará por pantalla. Y así sucesivamente ya que el juego continua de manera que otros procesos puedan ganar. Ejercicio 2 (4 puntos) Modificar el programa anterior para que, cuando un jugador cante bingo, este le envíe su rango al organizador, le proclame como ganador por pantalla, y envíe a todos los participantes el número 0 para indicar que deben finalizar y termine el programa. 4 5 En este código hemos realizado unas pequeñas modificaciones para que cuando el proceso identifique al ganador este cante bingo y el juego finalice. Las fuentes usadas para realizar el trabajo son procedentes de: fuente aleatorios: https://blog.martincruz.me/2012/09/obtener-numeros-aleatorios-enc-rand.html fuente leer archivo: https://parzibyte.me/blog/2020/09/11/leer-archivo-texto-cpp/ Conclusión Mediante el uso de la función MPI_Barrier hemos conseguido que todos los procesos consigan sincronizarse esperándose unos a otros. Consiguiendo así el correcto funcionamiento del código de programas paralelos. 6