El primer nodo se constituye como maestro, generando las matrices aleatorias y distribuyéndolas a los procesos esclavos por medio de un mecanismo de broadcast.
Los esclavos reciben las matrices a multiplicar, y determinan el número de procesos que participan en el cálculo, así como su lugar en la lista de procesos. Con esta información cada proceso puede decidir cuáles renglones debe resolver. En particular, los nodos se distribuyen equitativamente los renglones, dejando al último nodo los renglones restantes o residuo.
Como un ejemplo, si se tiene una matriz de
, y en el
cálculo participan 7 nodos, se realiza la operación
,
descartando la parte fraccionaria, obteniendo 14 renglones por cada
nodo. Los dos renglones residuales se asignan automáticamente al
último nodo. De esta forma la asignación de trabajo queda como sigue:
Nodo | Renglones |
---|---|
1 | 0-13 |
2 | 14-27 |
3 | 28-41 |
4 | 42-55 |
5 | 56-69 |
6 | 70-83 |
7 | 84-99 |
Una vez habiendo recibido las matrices a operar y conociendo el bloque de renglones asignados, cada nodo esclavo procede a calcular, entregando los resultados parciales al nodo maestro, estos resultados se envían a través de un mensaje punto a punto (mecanismo send). El nodo maestro recibe estos resultados por medio de un mecanismo receive, contabilizando el número de renglones resueltos, y cuando se tiene la matriz completamente resuelta, el proceso se da por terminado.
Este programa realiza el mismo proceso de medición de tiempo de cálculo que se efectúa en la versión uniprocesador, a fin de tener valores para comparar el desempeño. Cabe hacer notar que el muestreo de tiempo toma en cuenta el tiempo empleado en la transmisión de las matrices (broadcast) pues este tiempo efectivamente forma parte de la realización del cálculo con paralelismo.