Práctica: matriz × vector
PD03, Ej. 2: con de . P0 tiene y , reparte por bloques de filas o de columnas, envía y obtiene . en ambos: toda la diferencia de escalabilidad está en el overhead.
MPI_Bcast(v, N, MPI_LONG_LONG, 0, MPI_COMM_WORLD);MPI_Scatter(A, elem_proc, MPI_INT, local_A, elem_proc, MPI_INT, 0, MPI_COMM_WORLD);
for (i = 0; i < fil_proc; i++) { // fil_proc = N / size local_x[i] = 0; for (j = 0; j < N; j++) local_x[i] += local_A[i * N + j] * v[j];}
MPI_Gather(local_x, fil_proc, MPI_LONG_LONG, x, fil_proc, MPI_LONG_LONG, 0, MPI_COMM_WORLD);MPI_Type_vector(N, col_proc, N, MPI_LONG_LONG, &coltype); // bloque de columnasMPI_Type_commit(&coltype);
if (rank == 0) { for (dest = 1; dest < size; dest++) { // p-1 envíos secuenciales MPI_Send(&A[dest * col_proc], 1, coltype, dest, 0, MPI_COMM_WORLD); MPI_Send(&v[dest * col_proc], col_proc, MPI_LONG_LONG, dest, 1, MPI_COMM_WORLD); }} else { MPI_Recv(local_A, N * col_proc, MPI_LONG_LONG, 0, 0, MPI_COMM_WORLD, &status); MPI_Recv(local_v, col_proc, MPI_LONG_LONG, 0, 1, MPI_COMM_WORLD, &status);}
for (i = 0; i < N; i++) { // x parcial de largo N partial_x[i] = 0; for (j = 0; j < col_proc; j++) partial_x[i] += local_A[i * col_proc + j] * local_v[j];}MPI_Reduce(partial_x, x, N, MPI_LONG_LONG, MPI_SUM, 0, MPI_COMM_WORLD);Matriz × vector: filas vs columnas vs bloques
A de N×N (aquí N=8) repartida entre p procesos. Color = proceso dueño de la celda.
| Fase | filas |
|---|---|
| Distribuir A | MPI_Scatter de N/p filas contiguas |
| Distribuir v | MPI_Bcast de v completo (N) |
| Cómputo | N/p productos punto de largo N |
| Resultado | MPI_Gather de N/p elementos de x |
Modelo teórico del examen (arquetipo B)
Datos medidos (practica_3_ofi, laptop, p = 1…10)
| p | filas, N=5040 (s) | columnas, N=5040 (s) | ||||
|---|---|---|---|---|---|---|
| T_ej | T_comp | T_comm | T_ej | T_comp | T_comm | |
| 2 | 0.0374 | 0.0109 | 0.0265 | 0.102 | 0.0117 | 0.0496 |
| 4 | 0.0496 | 0.0104 | 0.0391 | 0.118 | 0.0134 | 0.0593 |
| 6 | 0.0568 | 0.00946 | 0.0471 | 0.157 | 0.0114 | 0.0899 |
| 8 | 0.0654 | 0.00839 | 0.0568 | 0.168 | 0.00968 | 0.092 |
| 10 | 0.0719 | 0.00744 | 0.0642 | 0.174 | 0.0093 | 0.0964 |
Análisis (de analisis_escalabilidad.md)
Sección titulada «Análisis (de analisis_escalabilidad.md)»| Esquema | Isoeficiencia | : | |
|---|---|---|---|
| Filas | (colectivas en árbol) | (mejora) | |
| Columnas | (bucle de Send en P0) | no hay favorable | (no mejora) |
En columnas, P0 mueve datos él solo: una fracción serial al estilo Amdahl del mismo orden que el trabajo, que no se diluye al crecer . En filas, la fracción serial efectiva (estilo Gustafson).
Ejercicio (PD02 2025-II, Ej. 2 — arquetipo B)
Sección titulada «Ejercicio (PD02 2025-II, Ej. 2 — arquetipo B)»y . (a) ¿Cuál tiene mayor granularidad? (b) Condición de escalabilidad. (c) ¿Cuál es más escalable?
Ver solución
(a) , . Bloques tiene el denominador más chico ⇒ mayor granularidad ⇒ menor overhead de comunicación.
(b) Filas: . Bloques: .
(c) Bloques es más escalable. Solución oficial: con filas, al duplicar se obtiene ; con bloques se obtiene otra relación, «lo que lo hace más escalable, ya que cuando crece se requieren menos procesos para mantener la eficiencia constante». Dicho de otra forma: para un mismo , bloques necesita un mucho menor () para sostener la misma eficiencia.
Autoevaluación
0/4 correctas · 0 respondidasFuente ·practica_3_ofi/ejercicio02_row.cpp · practica_3_ofi/ejercicio02_col.cpp · practica_3_ofi/executed/eficiencia_resultados.csv · resultados_5040.csv · executed/analisis_escalabilidad.md · executed/informe_2_3.md · previos/2025-II PD02 S01/S02 (Ej. 2)