#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
void generar_serie(int inicio, int fin, int *serie) {
int valor = inicio * 2;
for (int i = inicio; i <= fin; i++) {
serie[i - inicio] = valor;
valor += 2;
}
}
int main(int argc, char **argv) {
int mi_rango, tamano_mundo;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &mi_rango);
MPI_Comm_size(MPI_COMM_WORLD, &tamano_mundo);
int N, M;
if (mi_rango == 0) {
printf("Ingrese el numero de terminos: "); printf("Ingrese el numero de procesadores: "); }
MPI_Bcast(&N, 1, MPI_INT, 0, MPI_COMM_WORLD);
MPI_Bcast(&M, 1, MPI_INT, 0, MPI_COMM_WORLD);
int terminos_por_proceso = N / M;
int inicio = mi_rango * terminos_por_proceso + 1;
int fin = (mi_rango + 1) * terminos_por_proceso;
int *serie_local
= (int *)malloc(terminos_por_proceso
* sizeof(int)); generar_serie(inicio, fin, serie_local);
int *serie_completa = NULL;
if (mi_rango == 0) {
serie_completa
= (int *)malloc(N
* sizeof(int)); }
MPI_Gather(serie_local, terminos_por_proceso, MPI_INT, serie_completa, terminos_por_proceso, MPI_INT, 0, MPI_COMM_WORLD);
if (mi_rango == 0) {
for (int i = 0; i < N; i++) {
printf("%d ", serie_completa
[i
]); }
}
MPI_Finalize();
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPG1waS5oPgoKdm9pZCBnZW5lcmFyX3NlcmllKGludCBpbmljaW8sIGludCBmaW4sIGludCAqc2VyaWUpIHsKICAgIGludCB2YWxvciA9IGluaWNpbyAqIDI7CiAgICBmb3IgKGludCBpID0gaW5pY2lvOyBpIDw9IGZpbjsgaSsrKSB7CiAgICAgICAgc2VyaWVbaSAtIGluaWNpb10gPSB2YWxvcjsKICAgICAgICB2YWxvciArPSAyOwogICAgfQp9CgppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKICAgIGludCBtaV9yYW5nbywgdGFtYW5vX211bmRvOwoKICAgIE1QSV9Jbml0KCZhcmdjLCAmYXJndik7CiAgICBNUElfQ29tbV9yYW5rKE1QSV9DT01NX1dPUkxELCAmbWlfcmFuZ28pOwogICAgTVBJX0NvbW1fc2l6ZShNUElfQ09NTV9XT1JMRCwgJnRhbWFub19tdW5kbyk7CgogICAgaW50IE4sIE07CiAgICBpZiAobWlfcmFuZ28gPT0gMCkgewogICAgICAgIHByaW50ZigiSW5ncmVzZSBlbCBudW1lcm8gZGUgdGVybWlub3M6ICIpOwogICAgICAgIHNjYW5mKCIlZCIsICZOKTsKICAgICAgICBwcmludGYoIkluZ3Jlc2UgZWwgbnVtZXJvIGRlIHByb2Nlc2Fkb3JlczogIik7CiAgICAgICAgc2NhbmYoIiVkIiwgJk0pOwogICAgfQoKICAgIE1QSV9CY2FzdCgmTiwgMSwgTVBJX0lOVCwgMCwgTVBJX0NPTU1fV09STEQpOwogICAgTVBJX0JjYXN0KCZNLCAxLCBNUElfSU5ULCAwLCBNUElfQ09NTV9XT1JMRCk7CgogICAgaW50IHRlcm1pbm9zX3Bvcl9wcm9jZXNvID0gTiAvIE07CiAgICBpbnQgaW5pY2lvID0gbWlfcmFuZ28gKiB0ZXJtaW5vc19wb3JfcHJvY2VzbyArIDE7CiAgICBpbnQgZmluID0gKG1pX3JhbmdvICsgMSkgKiB0ZXJtaW5vc19wb3JfcHJvY2VzbzsKCiAgICBpbnQgKnNlcmllX2xvY2FsID0gKGludCAqKW1hbGxvYyh0ZXJtaW5vc19wb3JfcHJvY2VzbyAqIHNpemVvZihpbnQpKTsKICAgIGdlbmVyYXJfc2VyaWUoaW5pY2lvLCBmaW4sIHNlcmllX2xvY2FsKTsKCiAgICBpbnQgKnNlcmllX2NvbXBsZXRhID0gTlVMTDsKICAgIGlmIChtaV9yYW5nbyA9PSAwKSB7CiAgICAgICAgc2VyaWVfY29tcGxldGEgPSAoaW50ICopbWFsbG9jKE4gKiBzaXplb2YoaW50KSk7CiAgICB9CgogICAgTVBJX0dhdGhlcihzZXJpZV9sb2NhbCwgdGVybWlub3NfcG9yX3Byb2Nlc28sIE1QSV9JTlQsIHNlcmllX2NvbXBsZXRhLCB0ZXJtaW5vc19wb3JfcHJvY2VzbywgTVBJX0lOVCwgMCwgTVBJX0NPTU1fV09STEQpOwoKICAgIGlmIChtaV9yYW5nbyA9PSAwKSB7CiAgICAgICAgcHJpbnRmKCJTZXJpZSBjb21wbGV0YTpcbiIpOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CiAgICAgICAgICAgIHByaW50ZigiJWQgIiwgc2VyaWVfY29tcGxldGFbaV0pOwogICAgICAgIH0KICAgICAgICBwcmludGYoIlxuIik7CgogICAgICAgIGZyZWUoc2VyaWVfY29tcGxldGEpOwogICAgfQoKICAgIGZyZWUoc2VyaWVfbG9jYWwpOwogICAgTVBJX0ZpbmFsaXplKCk7CgogICAgcmV0dXJuIDA7Cn0KCg==