SLIDE 16 class DotThread extends Thread { DotThread(Dotter parent) { this.parent = parent; } Dotter parent; public void run() { int i; double sum = 0; while ((i = parent.getNextIndex()) != -1) sum += parent.a[i] * parent.b[i]; parent.addPartialSum(sum); } }
'!"
#include <mpi.h> #include <stdio.h> int main(int argc, char *argv[]) { double sum, sum_local, a[256], b[256]; int i, n = 256, id, np; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &id); MPI_Comm_size(MPI_COMM_WORLD, &np); for (i = id; i < n; i += np) { a[i] = i * 0.5; b[i] = i * 2.0; } sum_local = 0; for (i = id; i < n; i += np) sum_local += a[i] * b[i]; MPI_Reduce(&sum_local, &sum, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (id == 0) printf("a*b = %f\n", sum); return 0; }
Dot-product - MPI version!
'#"
Initialization!
#include <mpi.h> #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { double sum, sum_local, a[256], b[256]; int *disps, *cnts; double *a_part, *b_part; int i, n = 256, id, np, share; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &id); MPI_Comm_size(MPI_COMM_WORLD, &np); share = n / np; if (id == 0) { for (i = 0; i < n; i++) { a[i] = i * 0.5; b[i] = i * 2.0; } }
Dot-product - MPI version (scatter)!
'$"
cont’d on next page!
disps = (int *) malloc(np * sizeof(int)); cnts = (int *) malloc(np * sizeof(int));
for (i = 0; i < np; i++) { disps[i] = offset; cnts[i] = i < n - npp * share ? share + 1 : share;
} a_part = (double *) malloc(cnts[id] * sizeof(double)); b_part = (double *) malloc(cnts[id] * sizeof(double)); MPI_Scatterv(a, cnts, disps, MPI_DOUBLE, a_part, n, MPI_DOUBLE, 0, MPI_COMM_WORLD); MPI_Scatterv(b, cnts, disps, MPI_DOUBLE, b_part, n, MPI_DOUBLE, 0, MPI_COMM_WORLD); sum_local = 0; for (i = 0; i < cnts[id]; i++) sum_local += a_part[i] * b_part[i]; MPI_Reduce(&sum_local, &sum, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (id == 0) printf("a*b = %f\n", sum); return 0; }
'%"