#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
void matrixvectorproduct(double* A, double* x, double* y, int N, int M) {
for (int i = 0; i < N; i++) {
y[i] = 0.0; // Initialiser le résultat local
for (int j = 0; j < M; j++) {
y[i] += A[i * N + j] * x[j]; // Calculer le produit
}
}
}
void randomfill(double* buff, int size, double min, double max) {
const double range = (max - min);
const double div = RAND_MAX
/ range
; for (int i = 0; i < size; i++) {
}
}
int main(int argc, char* argv[]) {
int rank, size, Nloc;
const int N = 100, const M = 120;
double* A, * Aloc, * x, * y, * yloc, ts, te;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);
if (N % size) {
if (rank == 0) {
}
MPI_Abort(MPI_COMM_WORLS);
}
Nloc = N / size;
x
= (double*)malloc(M
* sizeof(double)); if (rank == 0) {
A
= (double*)malloc(M
* N
* sizeof(double)); y
= (double*)malloc(N
* sizeof(double)); randomfill(A, N * M, 0.0, 1.0);
randomfill(x, M, 0.0, 1.0);
Aloc
= (double*)malloc(M
* Nloc
* sizeof(double)); yloc
= (double*)malloc(Nloc
* sizeof(double)); MPI_Bcast(x, M, MPI_Double, 0, MPI_COMM_WORLD);
MPI_Scatter(A, Nloc * M, MPI_Double, Aloc, M * Nloc, MPI_Double, 0, MPI_COMM_WORLD);
matrixvectorproduct(Aloc, x, yloc, Nloc, M);
MPI_Gather(yloc, Nloc, MPI_Double, y, Nloc, MPI_Double, 0, MPI_COMM_WORLD);
}
retrun 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPG1waS5oPgoKdm9pZCBtYXRyaXh2ZWN0b3Jwcm9kdWN0KGRvdWJsZSogQSwgZG91YmxlKiB4LCBkb3VibGUqIHksIGludCBOLCBpbnQgTSkgewoJZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKCQl5W2ldID0gMC4wOyAvLyBJbml0aWFsaXNlciBsZSByw6lzdWx0YXQgbG9jYWwKCQlmb3IgKGludCBqID0gMDsgaiA8IE07IGorKykgewoJCQl5W2ldICs9IEFbaSAqIE4gKyBqXSAqIHhbal07IC8vIENhbGN1bGVyIGxlIHByb2R1aXQKCQl9Cgl9Cn0KCnZvaWQgcmFuZG9tZmlsbChkb3VibGUqIGJ1ZmYsIGludCBzaXplLCBkb3VibGUgbWluLCBkb3VibGUgbWF4KSB7CgoJY29uc3QgZG91YmxlIHJhbmdlID0gKG1heCAtIG1pbik7Cgljb25zdCBkb3VibGUgZGl2ID0gUkFORF9NQVggLyByYW5nZTsKCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CgkJYnVmZltpXSA9IG1pbiArIChyYW5kKCkgLyBkaXYpOwoJfQp9CmludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKCWludCByYW5rLCBzaXplLCBObG9jOwoJY29uc3QgaW50IE4gPSAxMDAsIGNvbnN0IE0gPSAxMjA7Cglkb3VibGUqIEEsICogQWxvYywgKiB4LCAqIHksICogeWxvYywgdHMsIHRlOwoKCU1QSV9Jbml0KCZhcmdjLCAmYXJndik7CglNUElfQ29tbV9yYW5rKE1QSV9DT01NX1dPUkxELCAmcmFuayk7CglNUElfQ29tbV9zaXplKE1QSV9DT01NX1dPUkxELCAmc2l6ZSk7CgoJTVBJX0JjYXN0KCZuLCAxLCBNUElfSU5ULCAwLCBNUElfQ09NTV9XT1JMRCk7CgoJaWYgKE4gJSBzaXplKSB7CgkJaWYgKHJhbmsgPT0gMCkgewoJCQlwcmludGYoIkltcG9zc2libGUiKTsKCgkJfQoJCU1QSV9BYm9ydChNUElfQ09NTV9XT1JMUyk7Cgl9CgoJTmxvYyA9IE4gLyBzaXplOwoJeCA9IChkb3VibGUqKW1hbGxvYyhNICogc2l6ZW9mKGRvdWJsZSkpOwoJaWYgKHJhbmsgPT0gMCkgewoJCUEgPSAoZG91YmxlKiltYWxsb2MoTSAqIE4gKiBzaXplb2YoZG91YmxlKSk7CgkJeSA9IChkb3VibGUqKW1hbGxvYyhOICogc2l6ZW9mKGRvdWJsZSkpOwoJCXJhbmRvbWZpbGwoQSwgTiAqIE0sIDAuMCwgMS4wKTsKCQlyYW5kb21maWxsKHgsIE0sIDAuMCwgMS4wKTsKCQlBbG9jID0gKGRvdWJsZSopbWFsbG9jKE0gKiBObG9jICogc2l6ZW9mKGRvdWJsZSkpOwoJCXlsb2MgPSAoZG91YmxlKiltYWxsb2MoTmxvYyAqIHNpemVvZihkb3VibGUpKTsKCQlNUElfQmNhc3QoeCwgTSwgTVBJX0RvdWJsZSwgMCwgTVBJX0NPTU1fV09STEQpOwoJCU1QSV9TY2F0dGVyKEEsIE5sb2MgKiBNLCBNUElfRG91YmxlLCBBbG9jLCBNICogTmxvYywgTVBJX0RvdWJsZSwgMCwgTVBJX0NPTU1fV09STEQpOwoJCW1hdHJpeHZlY3RvcnByb2R1Y3QoQWxvYywgeCwgeWxvYywgTmxvYywgTSk7CgkJTVBJX0dhdGhlcih5bG9jLCBObG9jLCBNUElfRG91YmxlLCB5LCBObG9jLCBNUElfRG91YmxlLCAwLCBNUElfQ09NTV9XT1JMRCk7Cgl9CglyZXRydW4gMDsKfQ==