1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
| int main(int argc, char ** argv) {
matrix A;
matrix B;
matrix C;
matrix rows_from_A;
matrix cols_from_B;
matrix result;
int nb_proc, proc_id, i, j, k, l, successor, predecessor;
int average = 0;
int extra;
int sum;
MPI_Status status;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &nb_proc);
MPI_Comm_rank(MPI_COMM_WORLD, &proc_id);
average = 4 / nb_proc;
extra = 4 % nb_proc;
printf("-------------\n");
printf("proc = %i\n", proc_id);
printf("average = %i\n", average);
rows_from_A = create_matrix(average, 4);
cols_from_B = create_matrix(4, average);
result = create_matrix(average, average);
/* Processus maître */
if (proc_id == MASTER) {
A = create_matrix(4, 4);
B = create_matrix(4, 4);
C = create_matrix(A.rows, B.cols);
init_random_matrix(&A);
init_random_matrix(&B);
init_matrix(&C);
printf("-- Matrice A --\n");
display_matrix(A);
printf("-- Matrice B --\n");
display_matrix(B);
/* On distribue les lignes de A et
les colonnes de B sur les nb_proc procs */
for (i = 0; i < nb_proc; i++) {
printf("i=%i, ", i);
rows_from_A.data = get_rows_from_matrix(A, i, average);
cols_from_B.data = get_cols_from_matrix(B, i, average);
printf("-- Lignes de A envoyées au proc %i\n", i);
display_matrix(rows_from_A);
printf("-- Colonnes de B envoyées au proc %i\n", i);
display_matrix(cols_from_B);
MPI_Send(rows_from_A.data, average * A.cols, MPI_INT, i, MASTER, MPI_COMM_WORLD);
MPI_Send(cols_from_B.data, average * B.rows, MPI_INT, i, MASTER, MPI_COMM_WORLD);
}
}
/* Chaque proc reçoit les données initiales du MASTER */
printf("Tentative de réception depuis MASTER sur proc %i\n", proc_id);
MPI_Recv(rows_from_A.data, 4 * average, MPI_INT, MASTER, proc_id, MPI_COMM_WORLD, &status);
MPI_Recv(cols_from_B.data, 4 * average, MPI_INT, MASTER, proc_id, MPI_COMM_WORLD, &status);
printf("-- Réception Proc %i --\n", proc_id);
display_matrix(rows_from_A);
display_matrix(cols_from_B);
printf("-- fin réception\n");
/* Calcul des colonnes résultats */
for (i = 0; i < nb_proc - 1; i++){
successor = (proc_id + 1) % nb_proc;
predecessor = proc_id - 1;
if (predecessor < 0)
predecessor = nb_proc - 1;
printf("Calcul local\n");
/* Calcul local à refaire car incorrect */
for (j = 0; j < average; j++) {
for (k = 0; k < average; k++) {
result.data[j][k] = 0;
for (l = 0; l < average; l++) {
sum = result.data[j][k];
result.data[j][k] = sum + rows_from_A.data[j][l] * cols_from_B.data[l][k];
}
}
}
printf("Envoie au successeur %i des lignes de A de %i\n", successor, proc_id);
/* Envoie à son successeur des lignes et des colonnes */
MPI_Send(rows_from_A.data, 4 * average, MPI_INT, successor, proc_id, MPI_COMM_WORLD);
printf("Réception de son prédecesseur %i des lignes de A\n", predecessor);
/* Réception de son prédécesseur des lignes et des colonnes */
MPI_Recv(rows_from_A.data, 4 * average, MPI_INT, predecessor, proc_id, MPI_COMM_WORLD, &status);
printf("-- Réception du predecesseur %i --\n", status);
display_matrix(rows_from_A);
printf("-- fin réception\n");
}
/* Chaque proc envoie au proc maître sa matrice résultat */
// todo
/* Le maître recopie les résultats dans sa matrice C résultat */
// todo
MPI_Finalize();
return EXIT_SUCCESS;
} |
Partager