Last updated: 2022-11-01

The file mpi-dot.c contains a MPI program that computes the dot product between two arrays `a[]`

and `b[]`

of length \(n\). The dot product \(s\) of two arrays `a[]`

and `b[]`

is defined as:

\[ s = \sum_{i = 0}^{n-1} a[i] \times b[i] \]

In the provided program, the master performs the whole computation and is therefore not parallel. The goal of this exercise is to write a parallel version. Assume that, at the beginning of the program, `a[]`

and `b[]`

are known only to the master. Therefore, they must be distributed across the processes. Each process computes the scalar product of the assigned portions of the arrays; the master then uses `MPI_Reduce()`

to sum the partial results and compute \(s\).

You may initially assume that \(n\) is an exact multiple of the number of MPI processes \(P\); then, relax this assumption and modify the program so that it works with any array length \(n\). The simpler solution is to distribute the arrays using `MPI_Scatter()`

and let the master take care of any excess data. Another possibility is to use `MPI_Scatterv()`

to distribute the input unevenly across the processes.

To compile:

` mpicc -std=c99 -Wall -Wpedantic mpi-dot.c -o mpi-dot -lm`

To execute:

` mpirun -n P ./mpi-dot [n]`

Example:

` mpirun -n 4 ./mpi-dot 1000`