Esta atividade deve ser colocada no repositório, nas pasta atividades/atividade07 sob os nomes de arquivos indicados na questão.
Valor: 2,5 Pontos
Data de Entrega: 07/09/2020.
Nesta atividade, vamos relembrar a multiplicação de matrizes, já apresentada na Atividade 02. Vamos voltar no tempo e trabalhar em versões seriais da multiplicação de matrizes. A primeira etapa consiste em usar a função da da Atividade 02 e criar uma versão serial mtxMult.c que atenda os seguintes requisitos:
Nós usamos o valor 1.0 para facilitar a depuração, pois a matriz resultante fica com todos seus valores iguais a ordem da matriz após a multiplicação. Para medir o tempo de execução, vamos usar a função time, aplicada antes e depois da chamada da função de multiplicação.
Após a primeira versão, você deve criar o arquivo mtxMult_linemajor.c e representar a matriz como um vetor linear com ordem de linha. Para entender essa organização, considere o exemplo abaixo:
// Organização de memória inicial
a[0][0]=0;
a[0][1]=1;
a[0][2]=2;
a[1][0]=3;
a[1][1]=4;
a[1][2]=5;
a[2][0]=6;
a[2][1]=7;
a[2][2]=8;
// Organização de memória linear
a[0] = 0; a[1] = 1; a[2] = 2;
a[3] = 3; a[4] = 4; a[5] = 5;
a[6] = 6; a[7] = 7; a[8] = 8;
Em outras palavras, as linhas da matriz são representadas de forma contínua na memória, sendo a posição inicial indicada pelo vetor. O seu programa mtxMult_linemajor.c deve atender os mesmos requisitos da versão anterior, mas agora usando a nova organização de memória. Você obviamente deve adaptar a função de multiplicação e realizar aritmética entre os índices i e j da versão versão inicial para corresponder as posições adequadas do vetor, que tem apenas um índice.
Ao final, faça a comparação (results_serial.txt) entre as duas versões, de acordo com a tabela abaixo, na qual N é o tamanho da matriz.
# Core i5 4440
# N Tempo mtxMult Tempo mtxMult_linemajor
64 ... ...
256 ... ...
1024 ... ...
2048 ... ...
Voltando ao mundo paralelo. Faça uma versão em MPI mtxMult_mpi.c. Você deve partir da versão com a matriz linear na memória, atendendo aos seguintes requisitos:
Considere N = 100. Com p = 4 processos, o processo 0 ficaria com as linhas 0 a 24 de A, o processo 1 com as linhas 25 a 49, o processo 2 com as linhas 50 a 74, e o processo 3 com as linhas 75 a 99. Cada um calcularia suas partições de C e o processo 0 consolidaria o resultado final.
Execute o programa anterior com N = 1.000.000 e com 2, 4 e 8 processos utilizando uma máquina com 8 núcleos na nuvem AWS. Instrumente o código com o uso da rotina MPI_Wtime(). Trace os gráficos, com o número de processadores no eixo x, para as seguintes grandezas: tempo de execução e speedup. Nomeie o gráfico de questao02_01node_08cores.png. Refaça os experimentos para um cluster de duas máquinas com 4 núcleos cada e nomeie o arquivo como questao02_02nodes_04cores.png.