#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
#define N 16 // Tamanho do vetor
int main(int argc, char **argv)
{
int rank, size;
double X[N], Y[N], Z_local[N], Z[N], a = 2.0;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
if (N % size != 0)
{
if (rank == 0)
{
printf("N deve ser divisível pelo número de processos.\n"); }
MPI_Finalize();
return 1;
}
if (rank == 0)
{
// Inicializa vetores X e Y
for (int i = 0; i < N; i++)
{
X
[i
] = ((double) rand() / RAND_MAX
); // Valores aleatórios entre 0 e 1 Y
[i
] = ((double) rand() / RAND_MAX
); }
}
// Distribui X, Y e a para todos os processos
MPI_Bcast(X, N, MPI_DOUBLE, 0, MPI_COMM_WORLD);
MPI_Bcast(Y, N, MPI_DOUBLE, 0, MPI_COMM_WORLD);
MPI_Bcast(&a, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD);
// Calcula Z_local = a <X, Y> para aumentar o tempo serial
for (int k = 0; k < 100000; k++)
{
for (int i = rank * (N / size); i < (rank + 1) * (N / size); i++)
{
Z_local[i] = a * X[i] * Y[i];
}
}
// Reduz os resultados locais para o processo 0
MPI_Reduce(Z_local, Z, N, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);
if (rank == 0)
{
printf("Resultados para %d processadores:\n", size
); for (int i = 0; i < N; i++)
{
}
}
MPI_Finalize();
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPG1waS5oPgoKI2RlZmluZSBOIDE2ICAvLyBUYW1hbmhvIGRvIHZldG9yCgppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCnsKICAgIGludCByYW5rLCBzaXplOwogICAgZG91YmxlIFhbTl0sIFlbTl0sIFpfbG9jYWxbTl0sIFpbTl0sIGEgPSAyLjA7ICAKCiAgICBNUElfSW5pdCgmYXJnYywgJmFyZ3YpOwogICAgTVBJX0NvbW1fcmFuayhNUElfQ09NTV9XT1JMRCwgJnJhbmspOwogICAgTVBJX0NvbW1fc2l6ZShNUElfQ09NTV9XT1JMRCwgJnNpemUpOwoKICAgIGlmIChOICUgc2l6ZSAhPSAwKQogICAgewogICAgICAgIGlmIChyYW5rID09IDApCiAgICAgICAgewogICAgICAgICAgICBwcmludGYoIk4gZGV2ZSBzZXIgZGl2aXPDrXZlbCBwZWxvIG7Dum1lcm8gZGUgcHJvY2Vzc29zLlxuIik7CiAgICAgICAgfQogICAgICAgIE1QSV9GaW5hbGl6ZSgpOwogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIGlmIChyYW5rID09IDApCiAgICB7CiAgICAgICAgLy8gSW5pY2lhbGl6YSB2ZXRvcmVzIFggZSBZCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspCiAgICAgICAgewogICAgICAgICAgICBYW2ldID0gKChkb3VibGUpIHJhbmQoKSAvIFJBTkRfTUFYKTsgIC8vIFZhbG9yZXMgYWxlYXTDs3Jpb3MgZW50cmUgMCBlIDEKICAgICAgICAgICAgWVtpXSA9ICgoZG91YmxlKSByYW5kKCkgLyBSQU5EX01BWCk7CiAgICAgICAgfQogICAgfQoKICAgIC8vIERpc3RyaWJ1aSBYLCBZIGUgYSBwYXJhIHRvZG9zIG9zIHByb2Nlc3NvcwogICAgTVBJX0JjYXN0KFgsIE4sIE1QSV9ET1VCTEUsIDAsIE1QSV9DT01NX1dPUkxEKTsKICAgIE1QSV9CY2FzdChZLCBOLCBNUElfRE9VQkxFLCAwLCBNUElfQ09NTV9XT1JMRCk7CiAgICBNUElfQmNhc3QoJmEsIDEsIE1QSV9ET1VCTEUsIDAsIE1QSV9DT01NX1dPUkxEKTsKCiAgICAvLyBDYWxjdWxhIFpfbG9jYWwgPSBhIDxYLCBZPiBwYXJhIGF1bWVudGFyIG8gdGVtcG8gc2VyaWFsCiAgICBmb3IgKGludCBrID0gMDsgayA8IDEwMDAwMDsgaysrKQogICAgewogICAgICAgIGZvciAoaW50IGkgPSByYW5rICogKE4gLyBzaXplKTsgaSA8IChyYW5rICsgMSkgKiAoTiAvIHNpemUpOyBpKyspCiAgICAgICAgewogICAgICAgICAgICBaX2xvY2FsW2ldID0gYSAqIFhbaV0gKiBZW2ldOwogICAgICAgIH0KICAgIH0KCiAgICAvLyBSZWR1eiBvcyByZXN1bHRhZG9zIGxvY2FpcyBwYXJhIG8gcHJvY2Vzc28gMAogICAgTVBJX1JlZHVjZShaX2xvY2FsLCBaLCBOLCBNUElfRE9VQkxFLCBNUElfU1VNLCAwLCBNUElfQ09NTV9XT1JMRCk7CgogICAgaWYgKHJhbmsgPT0gMCkKICAgIHsKICAgICAgICBwcmludGYoIlJlc3VsdGFkb3MgcGFyYSAlZCBwcm9jZXNzYWRvcmVzOlxuIiwgc2l6ZSk7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspCiAgICAgICAgewogICAgICAgICAgICBwcmludGYoIiVmICIsIFpbaV0pOwogICAgICAgIH0KICAgICAgICBwcmludGYoIlxuIik7CiAgICB9CgogICAgTVBJX0ZpbmFsaXplKCk7CiAgICByZXR1cm4gMDsKfQoK