/* param 1 = taille des matrices au depart param 2 = incrementation param 3 = taille des matrices ŕ l'arrive param 4 = nombre d'itérations mpicc -O3 -o cmult cmult.c (using MPICH) mpirun -arch LINUX -np 1 ./cmult 400 2 402 1 */ #include #include #include #include #include typedef struct Complexe {double re; double img;} complexe; complexe zero; /* __inline__ complexe complexe_add(complexe a, complexe b) { return (complexe){a.re+b.re, a.img+b.img}; } __inline__ complexe complexe_mult(complexe x, complexe y) { return (complexe) {x.re*y.re-x.img*y.img, x.re*y.img+x.img*y.re}; } */ /* version generic */ __inline__ void* add(void *x, void *y) { complexe a=((complexe*) x)[0]; complexe b=((complexe*) y)[0]; return (void *) &((complexe){a.re+b.re, a.img+b.img}); } __inline__ void* mult(void *x, void *y) { complexe a=((complexe*) x)[0]; complexe b=((complexe*) y)[0]; return (void *) &((complexe){a.re*b.re-a.img*b.img, a.re*b.img+a.img*b.re}); } complexe random_complexe(void) { complexe c = {c.re=(double)(rand()%1000), c.img=(double)(rand()%1000)}; return c; } void multiply_generic(int n, void *zero, void* (*add)(void *a, void *b), void* (*mult)(void *a, void *b), void *a, void *b, void *c) { register int i,j,k; void *tmp; void *cc; void *tt1, *tt2, *tt3; for (i=0; i