Se puede apreciar que MPI es ligeramente más compacto, requiriendo menos código que PVM. Obteniendo las líneas de código fuente efectivas4.4 para cada archivo, se determinó que la implementación en MPI requiere 141 líneas de código, mientras que la implementación en PVM utiliza 192 líneas. Apoyando esta observación, se puede indicar que en general PVM es un poco más laborioso de utilizar que MPI, requiriendo en ocasiones más pasos para lograr el mismo resultado. Por ejemplo, la realización de un broadcast en MPI requiere únicamente una llamada a función, mientras que en PVM se requieren dos (una para empacar la información y otra para realizar el envío).
En general, se consideró que MPI proporciona una API más limpia y mejor planeada. Se requieren un menor número de llamadas a funciones, dichas funciones están mejor organizadas, y es obvio el hecho de que al momento de planear la API se tuvieron en cuenta la mayoría de las posibles necesidades de comunicación por paso de mensajes.
PVM es un proyecto con más antiguedad, y esto es obvio en algunas de sus funciones (en particular las funciones de manejo de grupo), dando la impresión de que dichas funciones se agregaron ``al vapor'' y un tanto sobre la marcha, sin dar mucha importancia a la planeación y enfatizando el lograr una implementación utilizable de la biblioteca. Por otro lado, la API de PVM es un tanto engorrosa, en ocasiones requiriendo un número de llamadas mayor para lograr funciones relativamente sencillas, y algunos comportamientos no están bien documentados.
Más allá de estos aspectos, se aprecia, tanto durante el desarrollo como por el hecho de que fue trivial el desarrollar la aplicación utilizando ambas bibliotecas, que ambas proporcionan las mismas primitivas básicas de paso de mensajes. Únicamente se emplearon las más elementales, como son broadcast y envío y recepción punto a punto, sin emplear mecanismos de sincronización ni llamadas de comunicaciones más complejas (como scatter/gather). Por otro lado, no se explotaron algunas de las características avanzadas de MPI, como manejo de archivos distribuido, mecanismos de control de comunicadores y comunicación entre ellos, y accesos directos a memoria, de forma que, si se requieren dichas características, quizá MPI es una mejor opción.
Con esta posible salvedad, cabe mencionar que ambas bibliotecas proporcionan aproximadamente la misma funcionalidad, de modo que la elección se puede dejar a criterio del programador; esto, desde luego, teniendo en mente que MPI presenta una implementación más limpia y mejor diseñada, y debería ser la elección primaria para proyectos nuevos.
A continuación se presenta una tabla comparativa donde se describen las tareas a realizar por medio de la biblioteca de paso de mensajes, así como las funciones de MPI y PVM, respectivamente, que realizan dicha tarea.
Tarea | Función en MPI | Función en PVM |
---|---|---|
Inicialización de bibliotecas paralelas | MPI_Init | Implícito |
Determinación de mi número | MPI_Comm_rank | pvm_mytid y |
de proceso | pvm_joingroup | |
Determinación de número de procesos en mi grupo o comunicador | MPI_Comm_size | pvm_gsize |
Obtención de nombre de procesador | MPI_Get_processor_name | no aplica |
Inicialización de buffers de envío | no aplica | pvm_initsend |
Empacado de mensajes | no aplica | pvm_pk* |
Desempacado de mensajes | no aplica | pvm_upk* |
Broadcast para matrices operando | MPI_Broadcast | pvm_bcast |
Recepción de broadcast | MPI_Broadcast | pvm_recv |
Recepción de renglones resueltos | MPI_Recv | pvm_recv |
Envío de renglones resueltos | MPI_Send | pvm_send |
Terminación de sesión paralela | MPI_Finalize | pvm_exit |