Multiplicação de Matrizes em Paralelo

A multiplicação de matrizes é uma das mais importantes operações da matemática e possui diversas aplicações na computação, como em Jogos Eletrônicos, Modelagem 3D, na Inteligência Artificial usando Redes Neurais, além de ser utilizada em diversos campos.

Ela é amplamente estudada e muitas otimizações são atualmente conhecidas. Nesta questão, iremos estudar um pouco essa operação e vamos explorar um pouco o paralelismo. O objetivo é realizar a multiplicação das matrizes A, B na matriz resultante C. E então, imprimir toda a matriz C.

Por exemplo, considera a matriz A (2x3):

5 3 7
9 1 4

Considere também a matriz B (3x2):

1 5
2 6
4 7

O resultado, será a matriz C (2x2), onde o elemento (1,1) será 5*1+3*2+7*45*1+3*2+7*4 o elemento (1,2) será 5*5+5*6+7*75*5+5*6+7*7, como mostra a Tabela abaixo:

(c1,1=5*1+3*2+7*4=39)(c_{1,1}=5*1+3*2+7*4 = 39) (c1,2=5*5+3*6+7*7=92)(c_{1,2}=5*5+3*6+7*7 = 92)
(c2,1=9*1+1*2+4*4=27)(c_{2,1}=9*1+1*2+4*4 = 27) (c2,2=9*5+1*6+4*7=79)(c_{2,2}=9*5+1*6+4*7 = 79)

Assim, a matriz C (2x2) será:

39 92
27 79

Neste exercício, você deve explorar o paralelismo! Todas as células podem ser calculadas em paralelo.

Entrada

A primeira linha é composta por 3 números inteiros: MM, KK e NN. Depois, a matriz AA é dada como entrada, onde nas próximas MM linhas, KK números são passados em cada. Depois, a matriz BB é a entrada. Onde nas próximas KK linhas, NN números são passados.

Saída

Seu programa deve imprimir a matriz, CC, com MM linhas e NN colunas. A matriz CC é de ponto flutuante de precisão dupla (double) e deve ser impresso apenas 2 casas decimais.

Restrições

Seu programa deve ser construído em OpenMP.

Exemplo de Entrada 1

4 4 4
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
0 0 0 1
0 0 1 0
0 1 0 0
1 0 0 0

Exemplo de Saída 1

1.00 1.00 1.00 1.00
2.00 2.00 2.00 2.00
3.00 3.00 3.00 3.00
4.00 4.00 4.00 4.00

Exemplo de Entrada 2

2 4 2
1 1 2 3
2 3 4 5
4 4
1 2
2 3
2 3

Exemplo de Saída 2

15.00 21.00
29.00 41.00

Nos últimos casos de teste, serão testadas matrizes 512x512 e 1024x1024. É esperado que, com o uso de paralelismo, seu programa consiga executar em menos de 4 segundos