#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
#define MATRIX_SIZE 8
#define VECTOR_SIZE 8
int main(int argc, char** argv) {
int rank, size;
int i, j, k;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
// Vérifier si le nombre de processeurs est compatible avec la taille de la matrice
if (MATRIX_SIZE % size != 0) {
if (rank == 0) {
printf("Le nombre de processeurs n'est pas compatible avec la taille de la matrice.\n"); }
MPI_Finalize();
return 0;
}
// Calculer la taille de chaque bloc de lignes
int block_size = MATRIX_SIZE / size;
// Allocation de mémoire pour les blocs locaux de la matrice A et le vecteur X
double* local_A
= (double*)malloc(sizeof(double) * block_size
* MATRIX_SIZE
); double* local_X
= (double*)malloc(sizeof(double) * VECTOR_SIZE
); double* local_Y
= (double*)malloc(sizeof(double) * block_size
);
// Initialisation des valeurs dans les blocs locaux de la matrice A et le vecteur X
for (i = 0; i < block_size; i++) {
for (j = 0; j < MATRIX_SIZE; j++) {
local_A[i * MATRIX_SIZE + j] = rank * block_size + i + j;
}
}
for (i = 0; i < VECTOR_SIZE; i++) {
local_X[i] = rank * VECTOR_SIZE + i;
}
// Effectuer la multiplication locale des blocs de lignes et du vecteur
for (i = 0; i < block_size; i++) {
local_Y[i] = 0.0;
for (j = 0; j < MATRIX_SIZE; j++) {
local_Y[i] += local_A[i * MATRIX_SIZE + j] * local_X[j];
}
}
// Rassembler les résultats de chaque processeur
double* global_Y = NULL;
if (rank == 0) {
global_Y
= (double*)malloc(sizeof(double) * MATRIX_SIZE
); }
MPI_Gather(local_Y, block_size, MPI_DOUBLE, global_Y, block_size, MPI_DOUBLE, 0, MPI_COMM_WORLD);
// Afficher les résultats
if (rank == 0) {
printf("Résultat de la multiplication matrice-vecteur:\n"); for (i = 0; i < MATRIX_SIZE; i++) {
}
}
MPI_Finalize();
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPG1waS5oPgoKI2RlZmluZSBNQVRSSVhfU0laRSA4CiNkZWZpbmUgVkVDVE9SX1NJWkUgOAoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CiAgICBpbnQgcmFuaywgc2l6ZTsKICAgIGludCBpLCBqLCBrOwoKICAgIE1QSV9Jbml0KCZhcmdjLCAmYXJndik7CiAgICBNUElfQ29tbV9yYW5rKE1QSV9DT01NX1dPUkxELCAmcmFuayk7CiAgICBNUElfQ29tbV9zaXplKE1QSV9DT01NX1dPUkxELCAmc2l6ZSk7CgogICAgLy8gVsOpcmlmaWVyIHNpIGxlIG5vbWJyZSBkZSBwcm9jZXNzZXVycyBlc3QgY29tcGF0aWJsZSBhdmVjIGxhIHRhaWxsZSBkZSBsYSBtYXRyaWNlCiAgICBpZiAoTUFUUklYX1NJWkUgJSBzaXplICE9IDApIHsKICAgICAgICBpZiAocmFuayA9PSAwKSB7CiAgICAgICAgICAgIHByaW50ZigiTGUgbm9tYnJlIGRlIHByb2Nlc3NldXJzIG4nZXN0IHBhcyBjb21wYXRpYmxlIGF2ZWMgbGEgdGFpbGxlIGRlIGxhIG1hdHJpY2UuXG4iKTsKICAgICAgICB9CiAgICAgICAgTVBJX0ZpbmFsaXplKCk7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgLy8gQ2FsY3VsZXIgbGEgdGFpbGxlIGRlIGNoYXF1ZSBibG9jIGRlIGxpZ25lcwogICAgaW50IGJsb2NrX3NpemUgPSBNQVRSSVhfU0laRSAvIHNpemU7CgogICAgLy8gQWxsb2NhdGlvbiBkZSBtw6ltb2lyZSBwb3VyIGxlcyBibG9jcyBsb2NhdXggZGUgbGEgbWF0cmljZSBBIGV0IGxlIHZlY3RldXIgWAogICAgZG91YmxlKiBsb2NhbF9BID0gKGRvdWJsZSopbWFsbG9jKHNpemVvZihkb3VibGUpICogYmxvY2tfc2l6ZSAqIE1BVFJJWF9TSVpFKTsKICAgIGRvdWJsZSogbG9jYWxfWCA9IChkb3VibGUqKW1hbGxvYyhzaXplb2YoZG91YmxlKSAqIFZFQ1RPUl9TSVpFKTsKICAgIGRvdWJsZSogbG9jYWxfWSA9IChkb3VibGUqKW1hbGxvYyhzaXplb2YoZG91YmxlKSAqIGJsb2NrX3NpemUpOwoKICAgIC8vIEluaXRpYWxpc2F0aW9uIGRlcyB2YWxldXJzIGRhbnMgbGVzIGJsb2NzIGxvY2F1eCBkZSBsYSBtYXRyaWNlIEEgZXQgbGUgdmVjdGV1ciBYCiAgICBmb3IgKGkgPSAwOyBpIDwgYmxvY2tfc2l6ZTsgaSsrKSB7CiAgICAgICAgZm9yIChqID0gMDsgaiA8IE1BVFJJWF9TSVpFOyBqKyspIHsKICAgICAgICAgICAgbG9jYWxfQVtpICogTUFUUklYX1NJWkUgKyBqXSA9IHJhbmsgKiBibG9ja19zaXplICsgaSArIGo7CiAgICAgICAgfQogICAgfQoKICAgIGZvciAoaSA9IDA7IGkgPCBWRUNUT1JfU0laRTsgaSsrKSB7CiAgICAgICAgbG9jYWxfWFtpXSA9IHJhbmsgKiBWRUNUT1JfU0laRSArIGk7CiAgICB9CgogICAgLy8gRWZmZWN0dWVyIGxhIG11bHRpcGxpY2F0aW9uIGxvY2FsZSBkZXMgYmxvY3MgZGUgbGlnbmVzIGV0IGR1IHZlY3RldXIKICAgIGZvciAoaSA9IDA7IGkgPCBibG9ja19zaXplOyBpKyspIHsKICAgICAgICBsb2NhbF9ZW2ldID0gMC4wOwogICAgICAgIGZvciAoaiA9IDA7IGogPCBNQVRSSVhfU0laRTsgaisrKSB7CiAgICAgICAgICAgIGxvY2FsX1lbaV0gKz0gbG9jYWxfQVtpICogTUFUUklYX1NJWkUgKyBqXSAqIGxvY2FsX1hbal07CiAgICAgICAgfQogICAgfQoKICAgIC8vIFJhc3NlbWJsZXIgbGVzIHLDqXN1bHRhdHMgZGUgY2hhcXVlIHByb2Nlc3NldXIKICAgIGRvdWJsZSogZ2xvYmFsX1kgPSBOVUxMOwogICAgaWYgKHJhbmsgPT0gMCkgewogICAgICAgIGdsb2JhbF9ZID0gKGRvdWJsZSopbWFsbG9jKHNpemVvZihkb3VibGUpICogTUFUUklYX1NJWkUpOwogICAgfQoKICAgIE1QSV9HYXRoZXIobG9jYWxfWSwgYmxvY2tfc2l6ZSwgTVBJX0RPVUJMRSwgZ2xvYmFsX1ksIGJsb2NrX3NpemUsIE1QSV9ET1VCTEUsIDAsIE1QSV9DT01NX1dPUkxEKTsKCiAgICAvLyBBZmZpY2hlciBsZXMgcsOpc3VsdGF0cwogICAgaWYgKHJhbmsgPT0gMCkgewogICAgICAgIHByaW50ZigiUsOpc3VsdGF0IGRlIGxhIG11bHRpcGxpY2F0aW9uIG1hdHJpY2UtdmVjdGV1cjpcbiIpOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVRSSVhfU0laRTsgaSsrKSB7CiAgICAgICAgICAgIHByaW50ZigiJWYgIiwgZ2xvYmFsX1lbaV0pOwogICAgICAgIH0KICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgZnJlZShnbG9iYWxfWSk7CiAgICB9CgogICAgZnJlZShsb2NhbF9BKTsKICAgIGZyZWUobG9jYWxfWCk7CiAgICBmcmVlKGxvY2FsX1kpOwoKICAgIE1QSV9GaW5hbGl6ZSgpOwogICAgcmV0dXJuIDA7Cn0K