Witam!
Napisałem sobie o to taki prosty programik do mnożenia macierzy.
#include <stdio.h>
#include <stdlib.h> //funkcja rand()
#include <time.h> // zarzadzanie czasem
//#include "mpi.h"
int main(int argc, char *argv[])
{
int n, m, j, k; //deklaracja wymiarow macierzy
printf("Podaj wymiary dwoch macierzy:"); // tylko 3 wymiary bo liczba kolumn pierwszej musi byc rowna liczbie wierszy drugiej
scanf("%d%d%d", &n, &m, &k);
j = m ;
int macierzA[n][m];
int macierzB[j][k];
int wynik[n][k];
printf("Pierwsza macierz: n=%d, m=%d\n", n, m);
printf("Druga macierz: j= %d, k=%d\n", j, k);
printf("\n");
printf("Pierwsza macierz: \n");
int i, p, u; //deklaracja licznikow
for (i = 0; i < n; i++) //wpisywanie losowych wartosci wierszami
for (p = 0;p < m; p++)
macierzA[i][p] = rand() % 10; // generowanie wartosci od 0 do 9
for (i = 0; i < n; i++) // wypisywanie tablicy wierszami
{
printf("\n");
for (p = 0; p < m; p++)
printf("%d\t", macierzA[i][p]);
}
printf("\n\n");
printf("Druga macierz:\n");
for (i = 0; i < j; i++) //wpisywanie losowych wartosci wierszami
for (p = 0; p < k; p++)
macierzB[i][p] = rand() % 10; // generuje wartosci od 0 do 9
for (i = 0;i < j; i++) //wypisywanie tablicy wierszami
{
printf("\n");
for (p = 0; p < k; p++)
printf("%d\t", macierzB[i][p]);
}
printf("\n\n");
for (i = 0; i < n; i++) // mnozenie macierzy
for (p = 0; p < k; p++)
{
wynik[i][p] = 0; // przygotowanie macierzy wynikowej "wynik"
for (u= 0; u < j; u++)
wynik[i][p]= wynik[i][p] + macierzA[i][u] * macierzB[u][p]; // mnozenie
}
// wypisanie macierzy
printf("Macierz wynikowa: \n");
for (i = 0; i < n; i++)
{
printf("\n");
for (p = 0; p < k; p++)
printf("%d\t", wynik[i][p]);
}
return 0;
}
Problem w tym , że chciałbym teraz przerobić go tak aby wykonywał się przy użyciu załóżmy 4 PC czyli przy użyciu MPI.
Rozumiem ,że musiał bym zacząć od podzielenia macierzy wynikowej na 4 części tak aby każdy z PC otrzymał do wyliczenia 1/4 macierzy. Następnie każdy PC wylicza daną część macierzy
zwracają one wynik i następuje połączenie. Ze strony teoretycznej wiem jak to powinno wyglądać. Problem w tym ,że nie bardzo wiem jak skonstruować pętlę, która dzieliła i liczyła by macierz o rozmiarze podawanym dynamicznie ( weźmy na początek tylko macierze kwadratowe typu 2x2, 4x4, 8x8, 16x16 itp). Prosił bym o pomoc w tej sprawie :-)