#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
int main(int argc, char **argv)
{
int rank, comm_sz;
double vetor1[N], vetor2[N];
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &comm_sz);
// Tamanho do vetor e escalar
int N = 100000;
double a = 2.0;
//variaveis importantes
int partition = (N/comm_sz);
double results_local[partition], final_result;
if (rank == 0)
{
// Inicializa vetores
for (int i = 0; i < N; i++)
{
vetor1[i] = 1.0;
vetor2[i] = 1.0;
}
}
//Transmitindo variaveis
MPI_Bcast(vetor1, N, MPI_DOUBLE, 0, MPI_COMM_WORLD);
MPI_Bcast(vetor2, N, MPI_DOUBLE, 0, MPI_COMM_WORLD);
MPI_Bcast(&a, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD);
for (int i = rank*partition; i < (rank + 1)*partition; i++)
{
results_local[i] = vetor1[i] * vetor2[i];
}
// apliocando mpi reduce
MPI_Reduce(results_local, final_result, N, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);
if (rank == 0)
{
final_result *= a
printf("Número de processadores utilizados: %d\n", comm_sz
); printf("Resultado final: %.2f", final_result
) }
MPI_Finalize();
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPG1waS5oPgoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQp7CiAgICBpbnQgcmFuaywgY29tbV9zejsKICAgIGRvdWJsZSB2ZXRvcjFbTl0sIHZldG9yMltOXTsKCiAgICBNUElfSW5pdCgmYXJnYywgJmFyZ3YpOwogICAgTVBJX0NvbW1fcmFuayhNUElfQ09NTV9XT1JMRCwgJnJhbmspOwogICAgTVBJX0NvbW1fc2l6ZShNUElfQ09NTV9XT1JMRCwgJmNvbW1fc3opOwoKICAgIC8vIFRhbWFuaG8gZG8gdmV0b3IgZSBlc2NhbGFyCiAgICBpbnQgTiA9IDEwMDAwMDsKICAgIGRvdWJsZSBhID0gMi4wOwoKICAgIC8vdmFyaWF2ZWlzIGltcG9ydGFudGVzCiAgICBpbnQgcGFydGl0aW9uID0gKE4vY29tbV9zeik7CiAgICBkb3VibGUgcmVzdWx0c19sb2NhbFtwYXJ0aXRpb25dLCBmaW5hbF9yZXN1bHQ7CgoKICAgIGlmIChyYW5rID09IDApCiAgICB7CiAgICAgICAgLy8gSW5pY2lhbGl6YSB2ZXRvcmVzCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspCiAgICAgICAgewogICAgICAgICAgICB2ZXRvcjFbaV0gPSAxLjA7CiAgICAgICAgICAgIHZldG9yMltpXSA9IDEuMDsKICAgICAgICB9CiAgICB9CgogICAgLy9UcmFuc21pdGluZG8gdmFyaWF2ZWlzCiAgICBNUElfQmNhc3QodmV0b3IxLCBOLCBNUElfRE9VQkxFLCAwLCBNUElfQ09NTV9XT1JMRCk7CiAgICBNUElfQmNhc3QodmV0b3IyLCBOLCBNUElfRE9VQkxFLCAwLCBNUElfQ09NTV9XT1JMRCk7CiAgICBNUElfQmNhc3QoJmEsIDEsIE1QSV9ET1VCTEUsIDAsIE1QSV9DT01NX1dPUkxEKTsKCgoKICAgIGZvciAoaW50IGkgPSByYW5rKnBhcnRpdGlvbjsgaSA8IChyYW5rICsgMSkqcGFydGl0aW9uOyBpKyspCiAgICB7CiAgICAgICAgcmVzdWx0c19sb2NhbFtpXSA9IHZldG9yMVtpXSAqIHZldG9yMltpXTsKICAgIH0KCgogICAgLy8gYXBsaW9jYW5kbyBtcGkgcmVkdWNlCiAgICBNUElfUmVkdWNlKHJlc3VsdHNfbG9jYWwsIGZpbmFsX3Jlc3VsdCwgTiwgTVBJX0RPVUJMRSwgTVBJX1NVTSwgMCwgTVBJX0NPTU1fV09STEQpOwoKCgogICAgaWYgKHJhbmsgPT0gMCkKICAgIHsKICAgICAgICBmaW5hbF9yZXN1bHQgKj0gYQogICAgICAgIHByaW50ZigiTsO6bWVybyBkZSBwcm9jZXNzYWRvcmVzIHV0aWxpemFkb3M6ICVkXG4iLCBjb21tX3N6KTsKICAgICAgICBwcmludGYoIlJlc3VsdGFkbyBmaW5hbDogJS4yZiIsIGZpbmFsX3Jlc3VsdCkKICAgIH0KCiAgICBNUElfRmluYWxpemUoKTsKICAgIHJldHVybiAwOwp9Cg==