Saltar al contenido
← Volver a la bitácora

Computación· · Semestre: Otoño 2025· 2 min de lectura

Un Bag-of-Words paralelo con MPI y lo que enseña medir

El proyecto de Cómputo Paralelo: implementar Bag-of-Words en serie y en paralelo con MPI en C++17, comparar dos formas de repartir documentos entre procesos y descubrir que la intuición pierde contra el cronómetro.

Bag-of-Words es el modelo más simple de texto que existe: cuentas cuántas veces aparece cada palabra en cada documento y obtienes una matriz enorme y dispersa. Es trivial en serie y, por eso mismo, un buen banco de pruebas para paralelismo: el problema es fácil de entender y toda la dificultad está en repartir el trabajo.

El diseño

Dos implementaciones sobre el mismo código de conteo. La serial procesa los documentos uno tras otro y sirve de línea base. La paralela con MPI reparte los documentos entre procesos, cada proceso construye su vocabulario y sus conteos parciales, y al final se hace una reducción para unificar el vocabulario global y las matrices.

La pregunta interesante no era “cómo paralelizo” sino “cómo reparto”. Probé dos estrategias:

Lo que midió el cronómetro

Con documentos parecidos entre sí, las dos estrategias empatan. En cuanto la colección se sesga, con unos cuantos documentos muy largos y muchos cortos, round-robin se derrumba: un proceso termina cargando con los gigantes mientras los demás esperan en la barrera, y el tiempo total es el del más lento. La partición balanceada mantiene los procesos ocupados casi hasta el final. La diferencia no era marginal; era la que separa “paralelo” de “paralelo en el nombre”.

La lección no es sobre MPI. Es que el desbalance de carga es el enemigo silencioso de todo sistema distribuido, y que la única forma de detectarlo es medir por proceso, no solo el total.

Ingeniería alrededor

Lo que me llevo

Que antes de optimizar hay que instrumentar. Que la estrategia obvia de reparto es la peor en cuanto los datos dejan de ser uniformes, y los datos reales nunca son uniformes. Y que este mismo problema, con otro nombre, es el que enfrento cuando una tabla particionada en el warehouse tiene una partición diez veces más grande que las demás.