#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 random_fill(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)); random_fill(A, N * M, 0.0, 1.0);
random_fill(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);
matrix_vector_product(Aloc, x, yloc, Nloc, M);
MPI_Gather(yloc, Nloc, MPI_Double, y, Nloc, MPI_Double, 0, MPI_COMM_WORLD);
}
retrun 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPG1waS5oPgoKdm9pZCBtYXRyaXh2ZWN0b3Jwcm9kdWN0KGRvdWJsZSogQSwsIGRvdWJsZSogeCwgZG91YmxlKiB5LCBpbnQgTiwgaW50IE0pIHsKCWZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CgkJeVtpXSA9IDAuMDsgLy8gSW5pdGlhbGlzZXIgbGUgcsOpc3VsdGF0IGxvY2FsCgkJZm9yIChpbnQgaiA9IDA7IGogPCBNOyBqKyspIHsKCQkJeVtpXSArPSBBW2kgKiBOICsgal0gKiB4W2pdOyAvLyBDYWxjdWxlciBsZSBwcm9kdWl0CgkJfQoJfQp9Cgp2b2lkIHJhbmRvbV9maWxsKGRvdWJsZSogYnVmZiwgaW50IHNpemUsIGRvdWJsZSBtaW4sIGRvdWJsZSBtYXgpIHsKCgljb25zdCBkb3VibGUgcmFuZ2UgPSAobWF4IC0gbWluKTsKCWNvbnN0IGRvdWJsZSBkaXYgPSBSQU5EX01BWCAvIHJhbmdlOwoJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKCQlidWZmW2ldID0gbWluICsgKHJhbmQoKSAvIGRpdik7Cgl9Cn0KaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgewoJaW50IHJhbmssIHNpemUsIE5sb2M7Cgljb25zdCBpbnQgTiA9IDEwMCwgY29uc3QgTSA9IDEyMDsKCWRvdWJsZSogQSwgKiBBbG9jLCAqIHgsICogeSwgKiB5bG9jLCB0cywgdGU7CgoJTVBJX0luaXQoJmFyZ2MsICZhcmd2KTsKCU1QSV9Db21tX3JhbmsoTVBJX0NPTU1fV09STEQsICZyYW5rKTsKCU1QSV9Db21tX3NpemUoTVBJX0NPTU1fV09STEQsICZzaXplKTsKCglNUElfQmNhc3QoJm4sIDEsIE1QSV9JTlQsIDAsIE1QSV9DT01NX1dPUkxEKTsKCglpZiAoTiAlIHNpemUpIHsKCQlpZiAocmFuayA9PSAwKSB7CgkJCXByaW50ZigiSW1wb3NzaWJsZSIpOwoKCQl9CgkJTVBJX0Fib3J0KE1QSV9DT01NX1dPUkxTKTsKCX0KCglObG9jID0gTiAvIHNpemU7Cgl4ID0gKGRvdWJsZSopbWFsbG9jKE0gKiBzaXplb2YoZG91YmxlKSk7CglwcmludGYoIkREREQiKTsKCWlmIChyYW5rID09IDApIHsKCQlBID0gKGRvdWJsZSopbWFsbG9jKE0gKiBOICogc2l6ZW9mKGRvdWJsZSkpOwoJCXkgPSAoZG91YmxlKiltYWxsb2MoTiAqIHNpemVvZihkb3VibGUpKTsKCQlyYW5kb21fZmlsbChBLCBOICogTSwgMC4wLCAxLjApOwoJCXJhbmRvbV9maWxsKHgsIE0sIDAuMCwgMS4wKTsKCQlBbG9jID0gKGRvdWJsZSopbWFsbG9jKE0gKiBObG9jICogc2l6ZW9mKGRvdWJsZSkpOwoJCXlsb2MgPSAoZG91YmxlKiltYWxsb2MoTmxvYyAqIHNpemVvZihkb3VibGUpKTsKCQlNUElfQmNhc3QoeCwgTSwgTVBJX0RvdWJsZSwgMCwgTVBJX0NPTU1fV09STEQpOwoJCU1QSV9TY2F0dGVyKEEsIE5sb2MgKiBNLCBNUElfRG91YmxlLCBBbG9jLCBNICogTmxvYywgTVBJX0RvdWJsZSwgMCwgTVBJX0NPTU1fV09STEQpOwoJCW1hdHJpeF92ZWN0b3JfcHJvZHVjdChBbG9jLCB4LCB5bG9jLCBObG9jLCBNKTsKCQlNUElfR2F0aGVyKHlsb2MsIE5sb2MsIE1QSV9Eb3VibGUsIHksIE5sb2MsIE1QSV9Eb3VibGUsIDAsIE1QSV9DT01NX1dPUkxEKTsKCX0KCXJldHJ1biAwOwp9