Computação Paralela - Atividade 10

Esta atividade deve ser colocada no repositório, na pasta atividades/atividade10 sob o nome questao01.c.

Valor: 1,0 Ponto.

Data de Entrega: 24/07/2021.

Questão 01 - 1,0 Ponto

Considere a seguinte aplicação MPI. Nela, o processo 0 define uma quantidade aleatória de números (entre 0 e MAX-1) e os envia para o processo 1.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <mpi.h>
                        
#define MAX 100
                        
int main(int argc, char *argv[]) {
    int rank, total_num, tag = 0;
    int source = 0, destination = 1, numbers[MAX];
                        
    MPI_Status status;
                        
    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
                        
    if (rank == source) {
        srand(time(0));
        total_num = (rand() / (float) RAND_MAX) * MAX;
                        
        MPI_Send(numbers, total_num, MPI_INT, destination, tag, MPI_COMM_WORLD);
                        
        printf("Process %d sent %d numberts to 1\n", source, total_num);
    } else if (rank == destination) {
        MPI_Recv(numbers, MAX, MPI_INT, source, tag, MPI_COMM_WORLD, &status);
        MPI_Get_count(&status, MPI_INT, &total_num);
                        
        printf("Process %d received %d numbers. Source = %d, tag = %d\n", destination, total_num, status.MPI_SOURCE, status.MPI_TAG);
    }
                        
    MPI_Finalize();
                   
    return 0;
}
        

Este código utiliza a função MPI_Get_count, que recebe uma variável do tipo MPI_Status preenchida por uma chamada MPI_Recv anterior e retorna a quantidade de valores recebidos. Os valores dos números não importam, pois queremos apenas exercitar as funções do MPI.

Você deve modificar o código para que seja executado com um número qualquer de processos, e que todos os processos com rank diferente de 0 enviem uma mensagem com tamanho aleatório para o processo 0. Cada processo deve informar na tela quantos números está enviando ao 0. Quando terminar de receber todas as mensagens, o processo 0 deve também informar quantos números recebeu de cada outro processo. Salve o arquivo no repositório sob o nome questao01.c.

Dica: você pode usar MPI_ANY_SOURCE e MPI_ANY_TAG para facilitar a troca de mensagens.