Apéndice B Manual de Referencia Este apéndice describe de manera resumida las funciones MPI utilizadas en los algoritmos implementados. Pretendemos que sea una guía útil como manual de consulta. Para mayor comodidad las funciones están expuestas en orden alfabético. Para cada una de las funciones definimos su funcionalidad y su sintaxis, especificando cuáles son los parámetros de entrada y los de salida. Por último, en algunos casos haremos un breve comentario acerca de su funcionamiento. 175 APÉNDICE B. MANUAL DE REFERENCIA 176 B.1. MPI_Bcast F UNCIONALIDAD Envía un mismo mensaje desde un proceso a todos los demás. Es una operación de comunicación colectiva. S INTAXIS int MPI_Bcast(void* mensaje, int contador, MPI_Datatype tipo_datos, int raiz, MPI_Comm com); PARÁMETROS E NTRADA /S ALIDA mensaje Dirección inicial de memoria del mensaje a enviar/recibir contador Número de elementos del tipo tipo_datos que componen el mensaje tipo_datos Tipo de datos MPI de cada elemento del mensaje (Cuadro 5.1) raiz Identificador del proceso que envía el mensaje com Comunicador en el cual se produce la comunicación C OMENTARIOS Si el soporte hardware se hace responsable de la ejecución de esta función, generalmente se implementa mediante un algoritmo que estructura un modelo de comunicación en árbol entre los procesos. Para más información, léase la sección ??. B.2. MPI_CART_COORDS 177 B.2. MPI_Cart_coords F UNCIONALIDAD Retorna las coordenadas de un proceso en un comunicador de topología cartesiana, dado su identificador. S INTAXIS int MPI_Cart_coords(MPI_Comm cart_com, int id, int numero_dimensiones, int* coordenadas) PARÁMETROS E NTRADA cart_com Comunicador de topología cartesiana id Identificador del proceso dentro del comunicador cart_com numero_dimensiones Número de dimensiones del vector coordenadas PARÁMETROS S ALIDA coordenadas Vector de enteros (de tamaño numero_dimensiones) que contiene las coordenadas cartesianas del proceso APÉNDICE B. MANUAL DE REFERENCIA 178 B.3. MPI_Cart_create F UNCIONALIDAD Crea un nuevo comunicador de topología cartesiana (tipo rejilla). S INTAXIS int MPI_Cart_create(MPI_Comm antiguo_com, int numero_dimensiones, int* tam_dimensiones, int* periodicidades, int reordenamiento, MPI_Comm* com_cartesiano) PARÁMETROS E NTRADA antiguo_com Comunicador original a partir del cual creamos el nuevo comunicador de topología cartesiana numero_dimensiones Número de dimensiones de la rejilla cartesiana que queremos crear tam_dimensiones Vector de enteros de tamaño numero_dimensiones que especifica el número de procesos en cada dimensión periodicidades Vector de booleanos de tamaño numero_dimensiones que especifica para cada dimensión si es periódica (verdadero) o no (falso) reordenamiento Booleano que especifica si pueden ser reordenados los identificadores de los procesos (verdadero) o no (falso). En muchos casos es apropiado para la optimización del sistema, en otros no es significante. PARÁMETROS S ALIDA com_cartesiano Nuevo comunicador de topología cartesiana B.4. MPI_CART_RANK 179 B.4. MPI_Cart_rank F UNCIONALIDAD Retorna el identificador de un proceso en un comunicador de topología cartesiana, dadas sus coordenadas. S INTAXIS int MPI_Cart_rank(MPI_Comm cart_com, int* coordenadas, int* id) PARÁMETROS E NTRADA cart_com Comunicador de topología cartesiana coordenadas Vector de enteros (de tamaño numero_dimensiones, véase función B.3) que especifica las coordenadas cartesianas del proceso PARÁMETROS S ALIDA id Identificador del proceso especificado APÉNDICE B. MANUAL DE REFERENCIA 180 B.5. MPI_Cart_sub F UNCIONALIDAD Divide un comunicador de tipo rejilla (topología cartesiana) en rejillas de menores dimensiones. S INTAXIS int MPI_Cart_sub(MPI_Comm cart_com, int* var_coords, MPI_Comm nuevo_com) PARÁMETROS E NTRADA cart_com Comunicador de topología cartesiana var_coords Vector de booleanos que especifica para cada dimensión de cart_com si pertenece a nuevo_com, dejando que la coordenada varíe (verdadero) o no (falso) PARÁMETROS S ALIDA nuevo_com Nuevo comunicador de topología cartesiana con igual o menor número de dimensiones que cart_com B.6. MPI_COMM_CREATE 181 B.6. MPI_Comm_create F UNCIONALIDAD Crea un nuevo comunicador a partir de otro. S INTAXIS int MPI_Comm_create(MPI_Comm antiguo_com, MPI_Group nuevo_grupo, MPI_Comm* nuevo_com) PARÁMETROS E NTRADA antiguo_com Comunicador original a partir del cual generamos el nuevo comunicador nuevo_com Grupo que contiene los procesos que formarán parte del nuevo comunicador. Debe ser un subconjunto del grupo asociado al comunicador original (antiguo_com). PARÁMETROS S ALIDA nuevo_com Nuevo comunicador APÉNDICE B. MANUAL DE REFERENCIA 182 B.7. MPI_Comm_group F UNCIONALIDAD Retorna el grupo asociado a un comunicador determinado. S INTAXIS int MPI_Comm_group(MPI_Comm com, MPI_Group* grupo) PARÁMETROS E NTRADA com Comunicador PARÁMETROS S ALIDA grupo Grupo asociado al comunicador B.8. MPI_COMM_RANK B.8. MPI_Comm_rank F UNCIONALIDAD Retorna el identificador de un proceso dentro de un comunicador. S INTAXIS int MPI_Comm_rank(MPI_Comm com, int* id) PARÁMETROS E NTRADA com Comunicador dentro del cual el proceso tiene asociado el identificador PARÁMETROS S ALIDA id Identificador del proceso dentro del comunicador com 183 APÉNDICE B. MANUAL DE REFERENCIA 184 B.9. MPI_Comm_size F UNCIONALIDAD Determina el número de procesos pertenecientes al grupo asociado a un comunicador. S INTAXIS int MPI_Comm_size(MPI_Comm com, int* numprocs) PARÁMETROS E NTRADA com Comunicador al cual está asociado el grupo cuyo tamaño queremos conocer PARÁMETROS S ALIDA numprocs Número de procesos en el grupo del comunicador (entero) B.10. MPI_COMM_SPLIT 185 B.10. MPI_Comm_split F UNCIONALIDAD Particiona un comunicador en varios subconjuntos de procesos y crea un nuevo comunicador para cada uno de ellos. S INTAXIS int MPI_Comm_split(MPI_Comm antiguo_com, int clave_particion, int clave_id, MPI_Comm* nuevo_com) PARÁMETROS E NTRADA antiguo_com Comunicador original a partir del cual creamos los nuevos comunicadores clave_particion Número que representa el nuevo comunicador en el cual quedará englobado el proceso clave_id Identificador del proceso dentro del nuevo comunicador PARÁMETROS S ALIDA nuevo_com Nuevo comunicador (leer comentarios) C OMENTARIOS La llamada crea un comunicador para cada valor de clave_particion. Los procesos con el mismo valor en clave_particion quedan englobados en el mismo comunicador. Sin embargo los comunicadores creados tendrán el mismo nombre para todos los procesos. Imaginemos que dividimos de manera escalonada un comunicador con 9 procesos en tres comunicadores con 3 procesos, llamados todos nuevo_com. De esta manera, el grupo nuevo_com consistirá en los procesos 0, 1 y 2 para los procesos 0, 1 y 2. En los procesos 3, 4 y 5 el grupo subyacente a nuevo_com será el formado por los procesos 3, 4 y 5; y lo mismo ocurrirá con los procesos 6, 7 y 8. APÉNDICE B. MANUAL DE REFERENCIA 186 B.11. MPI_Finalize F UNCIONALIDAD Finaliza el entorno de ejecución MPI. Después de que el programa haya acabado de utilizar la librería MPI, se debe hacer una llamada a MPI_Finalize. Esta función limpia todos los trabajos no finalizados dejados por MPI (por ejemplo, envíos pendientes que no hayan sido completados, etc.). S INTAXIS int MPI_Finalize() Esta función no tiene parámetros. B.12. MPI_GET_PROCESSOR_NAME 187 B.12. MPI_Get_processor_name F UNCIONALIDAD Retorna el nombre del procesador donde está ubicado el proceso. S INTAXIS int MPI_Get_processor_name(char* nombre, int* longnombre) PARÁMETROS S ALIDA nombre Vector de caracteres cuyo tamaño debe ser al menos igual a la constante MPI_MAX_PROCESSOR_NAME destinado a contener el nombre del procesador longname Longitud (en caracteres) de la cadena obtenida C OMENTARIOS El nombre retornado debe identificar un elemento hardware específico; el formato exacto estará definido por la implementación. APÉNDICE B. MANUAL DE REFERENCIA 188 B.13. MPI_Group_incl F UNCIONALIDAD Crea un nuevo grupo a partir de una lista de procesos pertenecientes a un grupo existente. S INTAXIS int MPI_Group_incl(MPI_Group antiguo_grupo, int tamano_nuevo_grupo, int* ids_antiguo_grupo, MPI_Group* nuevo_grupo) PARÁMETROS E NTRADA antiguo_grupo Grupo original a partir del cual generamos el nuevo grupo tamano_nuevo_grupo Número de procesos que formarán el nuevo grupo ids_antiguo_grupo Identificadores de los procesos que formarán parte del nuevo grupo (vector de enteros) PARÁMETROS S ALIDA nuevo_grupo Nuevo grupo derivado del existente, reordenado según el vector ids_antiguo_grupo. B.14. MPI_INIT 189 B.14. MPI_Init F UNCIONALIDAD Inicializa el entorno de ejecución MPI. Antes de que podamos llamar a cualquier otra función MPI, debemos hacer una llamada a MPI_Init; esta función sólo debe ser llamada una vez. Permite al sistema hacer todas la configuraciones necesarias para que la librería MPI pueda ser usada. S INTAXIS int MPI_Init(int *argc, char ***argv); PARÁMETROS E NTRADA argc Puntero al número de argumentos argv Puntero a los vectores de argumentos APÉNDICE B. MANUAL DE REFERENCIA 190 B.15. MPI_Irecv F UNCIONALIDAD Inicializa la recepción de un mensaje no bloqueante. S INTAXIS int MPI_Recv(void* mensaje, int contador, MPI_Datatype tipo_datos, int origen, int etiqueta, MPI_Comm com, MPI_Request* peticion) PARÁMETROS E NTRADA contador Número de elementos del tipo tipo_datos que componen el mensaje a recibir tipo_datos Tipo de datos MPI de cada elemento del mensaje a recibir (Cuadro 5.1) origen Identificador del proceso origen etiq Etiqueta del mensaje com Comunicador en el cual se produce la comunicación PARÁMETROS S ALIDA mensaje Dirección inicial de memoria del mensaje a recibir peticion Manejador de la petición C OMENTARIOS Esta función recibe mensajes de tipo no bloqueante. Ello quiere decir que la ejecución del programa no se bloquea con la llamada a esta función. B.16. MPI_ISEND 191 B.16. MPI_Isend F UNCIONALIDAD Inicializa el envío de un mensaje no bloqueante a un proceso determinado. S INTAXIS int MPI_Isend(void* mensaje, int contador, MPI_Datatype tipo_datos, int destino, int etiq, MPI_Comm com, MPI_Request* peticion) PARÁMETROS E NTRADA mensaje Dirección inicial de memoria del mensaje a enviar contador Número de elementos del tipo tipo_datos que componen el mensaje a enviar tipo_datos Tipo de datos MPI de cada elemento del mensaje a enviar (Cuadro 5.1) destino Identificador del proceso destino etiq Etiqueta del mensaje com Comunicador en el que se produce la comunicación PARÁMETROS S ALIDA peticion Manejador de la petición C OMENTARIOS Esta función envía mensajes de tipo no bloqueante. Ello quiere decir que la ejecución del programa no se bloquea con la ejecución de la llamada. APÉNDICE B. MANUAL DE REFERENCIA 192 B.17. MPI_Recv F UNCIONALIDAD Recibe un mensaje básico de un proceso. S INTAXIS int MPI_Recv(void* mensaje, int contador, MPI_Datatype tipo_datos, int origen, int etiqueta, MPI_Comm com, MPI_Status* status) PARÁMETROS E NTRADA contador Número de elementos del tipo tipo_datos que componen el mensaje a recibir tipo_datos Tipo de datos MPI de cada elemento del mensaje a recibir (Cuadro 5.1) origen Identificador del proceso origen etiq Etiqueta del mensaje com Comunicador en el cual se produce la comunicación PARÁMETROS S ALIDA mensaje Dirección inicial de memoria del mensaje a recibir status Objeto que representa el estado de la recepción C OMENTARIOS Esta función recibe mensajes de tipo bloqueante. Ello quiere decir que la ejecución del programa se bloquea hasta que el mensaje ha sido recibido. B.18. MPI_REDUCE 193 B.18. MPI_Reduce F UNCIONALIDAD Reduce valores en todos los procesos a un solo valor. Realiza una operación de reducción. S INTAXIS int MPI_Reduce(void* operando, void* resultado, int contador, MPI_Datatype tipo_datos, MPI_Op operacion, int raiz, MPI_Comm com); PARÁMETROS E NTRADA operando Dirección inicial de memoria de los valores a operar contador Número de elementos del tipo tipo_datos que componen cada uno de los operandos y el resultado tipo_datos Tipo de datos MPI de los valores a operar operacion Operación de reducción a realizar (Cuadro 6.1) raiz Identificador del proceso que recibe el valor calculado com Comunicador en el cual se produce la comunicación PARÁMETROS S ALIDA resultado Dirección inicial de memoria del valor calculado a recibir (significante sólo en el proceso raiz) APÉNDICE B. MANUAL DE REFERENCIA 194 B.19. MPI_Send F UNCIONALIDAD Envía un mensaje básico a un proceso determinado. S INTAXIS int MPI_Send(void* mensaje, int contador, MPI_Datatype tipo_datos, int destino, int etiq, MPI_Comm com) PARÁMETROS E NTRADA mensaje Dirección inicial de memoria del mensaje a enviar contador Número de elementos del tipo tipo_datos que componen el mensaje a enviar tipo_datos Tipo de datos MPI de cada elemento del mensaje a enviar (Cuadro 5.1) destino Identificador del proceso destino etiq Etiqueta del mensaje com Comunicador en el que se produce la comunicación C OMENTARIOS Esta función envía mensajes de tipo bloqueante. Ello quiere decir que la ejecución del programa se bloquea hasta que el mensaje ha sido enviado. B.20. MPI_SENDRECV_REPLACE 195 B.20. MPI_Sendrecv_replace F UNCIONALIDAD Envía y recibe un mensaje básico utilizando un sólo buffer. S INTAXIS int MPI_Sendrecv_replace(void* mensaje, int contador, MPI_Datatype tipo_datos, int destino, int etiqdestino, int origen, int etiqorigen, MPI_Comm com, MPI_Status* status) PARÁMETROS E NTRADA mensaje Dirección inicial de memoria del mensaje a enviar y en la cual recibiremos el nuevo mensaje contador Número de elementos del tipo tipo_datos que componen el mensaje a enviar/recibir tipo_datos Tipo de datos MPI de cada elemento del mensaje a enviar/recibir (Cuadro 5.1) destino Identificador del proceso destino etiqdestino Etiqueta del mensaje a enviar origen Identificador del proceso origen etiqorigen Etiqueta del mensaje a recibir com Comunicador en el que se produce la comunicación C OMENTARIOS Esta función envía/recibe mensajes de tipo bloqueante. Ello quiere decir que la ejecución del programa se bloquea hasta que el mensaje ha sido enviado/recibido. APÉNDICE B. MANUAL DE REFERENCIA 196 B.21. MPI_Type_commit F UNCIONALIDAD Acomete un tipo de datos MPI. S INTAXIS int MPI_Type_commit(MPI_Datatype* tipo_datos_MPI) PARÁMETROS E NTRADA tipo_datos_MPI Tipo de datos MPI B.22. MPI_TYPE_STRUCT B.22. MPI_Type_struct F UNCIONALIDAD Crea un tipo de datos MPI para estructuras. S INTAXIS int MPI_Type_struct(int contador, int longitudes_bloque[], MPI_Aint indices[], MPI_Datatype antiguos_tipos_datos, MPI_Datatype* nuevo_tipo) PARÁMETROS E NTRADA contador Número de bloques longitud_bloque Número de elementos de tipo tipo_datos_elem de cada bloque indices Dirección relativa de cada bloque antigus_tipo_datos Tipos de datos de cada bloque PARÁMETROS S ALIDA nuevo_tipo Nuevo tipo de datos MPI 197 APÉNDICE B. MANUAL DE REFERENCIA 198 B.23. MPI_Type_vector F UNCIONALIDAD Crea un tipo de datos MPI para vectores. S INTAXIS int MPI_Type_vector(int contador, int longitud_bloque, int salto, MPI_Datatype tipo_datos_elem, MPI_Datatype* nuevo_tipo) PARÁMETROS E NTRADA contador Número de bloques longitud_bloque Número de elementos de tipo tipo_datos_elem en cada bloque salto Número de elementos de tipo tipo_datos_elem que hay entre los sucesivos elementos de nuevo_tipo. tipo_datos_elem Antiguo tipo de datos PARÁMETROS S ALIDA nuevo_tipo Nuevo tipo de datos MPI B.24. MPI_WAIT B.24. MPI_Wait F UNCIONALIDAD Espera a que se complete un envío o una recepción de un mensaje. S INTAXIS int MPI_Wait(MPI_Request* peticion, MPI_Status* status) PARÁMETROS E NTRADA peticion Manejador de la petición PARÁMETROS S ALIDA status Objeto que representa el estado del envío/recepción del mensaje 199 APÉNDICE B. MANUAL DE REFERENCIA 200 B.25. MPI_Waitall F UNCIONALIDAD Espera a que se completen todas las peticiones especificadas en un vector. S INTAXIS int MPI_Waitall(int contador, MPI_Request* vector_peticiones, MPI_Status* status) PARÁMETROS E NTRADA contador Longitud del vector de peticiones vector_peticiones Vector de peticiones PARÁMETROS S ALIDA status Objeto que representa el estado del envío/recepción del mensaje B.26. MPI_WAITANY B.26. MPI_Waitany F UNCIONALIDAD Espera a que se complete cualquiera de las peticiones especificadas en un vector. S INTAXIS int MPI_Waitany(int contador, MPI_Request* vector_peticiones, int* indice, MPI_Status* status) PARÁMETROS E NTRADA contador Longitud del vector de peticiones vector_peticiones Vector de peticiones PARÁMETROS S ALIDA indice Posición de la petición satisfecha en el vector de peticiones status Objeto que representa el estado del envío/recepción del mensaje 201 APÉNDICE B. MANUAL DE REFERENCIA 202 B.27. MPI_Wtime F UNCIONALIDAD Retorna el tiempo transcurrido para un proceso. S INTAXIS double MPI_Wtime() VALOR DE R ETORNO Tiempo en segundos desde que comenzó la ejecución del proceso. Conclusiones Para llegar a ciertas conclusiones en el estudio realizado lo primero que debemos hacer es analizar los resultados obtenidos en las ejecuciones de los algoritmos paralelos. Sólo de este modo podremos demostrar la utilidad y potencialidad del procesamiento paralelo ejecutado en redes bajo Linux. Sumario de Resultados Comenzaremos el análisis observando algunos gráficos ciertamente determinantes. La figura 1 muestra un gráfico que representa el tiempo de ejecución del algoritmo Cálculo de Áreas mediante Montecarlo utilizando paso de mensajes no bloqueantes. Calculo de Areas No Bloqueante: Tiempo Ejecucion 140 Tiempo Ejecucion 120 Tiempo (seg) 100 80 60 40 20 0 0 2 4 6 8 10 12 14 16 Numero de Procesadores Figura 1: Gráfico Tiempo Ejecución Cálculo de Áreas No Bloqueante En el gráfico observamos una notoria reducción en el tiempo de ejecución de dicho algoritmo conforme incorporamos procesadores al cómputo. Ello es lógico debido a que se trata de 203