#include #include #include #define MAXNPROCS 20 int [host]Input(); void [host]Output(); void Partition(), SeqMult(); void [net SimpleNet(p)w] ParMult(float *, float *, float *, repl *, repl); void [*]MxM(float *[host]x, float *[host]y, float *[host]z, int [host]n); nettype Star(m, n[m]) { coord I=m; node { I>=0: n[I]; }; }; int [host]N; void [*]main(int [host]argc, char **[host]argv) { float *[host]x, *[host]y, *[host]z; double [host]start; if(Input(&x, &y, argv[1])) { ([host]printf)("Wrong input\n"); MPC_Exit(-1); } z=([host]calloc)(N*N, [host](sizeof(float))); start=([host]MPC_Wtime)(); MxM(x, y, z, N); ([host]printf) ("It takes %f seconds to multiplicate\ntwo %dx%d dense matrices\n", (([host]MPC_Wtime)()-start), N, N); Output(z); } void [*]MxM(float *[host]x, float *[host]y, float *[host]z, int [host]n) { repl nprocs, nrows[MAXNPROCS], dn; repl double *powers; MPC_Processors_static_info(&nprocs, &powers); dn=n; Partition(nprocs, powers, nrows, dn); { int [host]i; for(i=0; i<[host]nprocs; i++) ([host]printf)("proc=%d nrows=%d\n", i, ([host]nrows)[i]); } { net Star(nprocs, nrows) w; float *[w]dx, *[w]dy, *[w]dz; repl [w]n; int [w]myn; int [w]sof; sof=[w](sizeof(float)); n=[w]dn; myn=([w]nrows)[I coordof dx]; dx=([w]calloc)(n*myn, sof); ([host]free)([host]dx); [host]dx=(void *)x; dy=([w]calloc)(n*n, sof); ([host]free)([host]dy); [host]dy=(void *)y; dz=([w]calloc)(n*myn, sof); ([host]free)([host]dz); [host]dz=(void *)z; ([([w]nprocs)w])ParMult(dx, dy, dz, [w]nrows, n); } } void [net SimpleNet(p)w] ParMult(float *dx, float *dy, float *dz, repl *r, repl n) { repl s=0; int myn, i; int *d, *l, c; myn=r[I coordof r]; ([(0)w])MPC_Bcast(&s, dy, 1, n*n, dy, 1); d=calloc(p, sizeof(int)); l=calloc(p, sizeof(int)); for(i=0, d[0]=0; i