Here we show a simple Fortran program, PSDOT, for computing a dot
product. The program computes the dot product of arrays, X and Y.
First PSDOT calls PVMFMYTID() and PVMFPARENT(). The PVMFPARENT call
will return PVMNOPARENT if the task wasn't spawned by another PVM
task. If this is the case, then PSDOT is the master and must spawn
the other worker copies of PSDOT. PSDOT then asks the user for the
number of processes to use and the length of vectors to compute. Each
spawned process will receive `n`/`nproc` elements of X and Y, where `n` is
the length of the vectors and `nproc` is the number of processes being
used in the computation. If `nproc` does not divide `n` evenly, then
the master will compute the dot product on extra the elements. The
subroutine SGENMAT randomly generates values for X and Y. PSDOT then
spawns `nproc` - 1 copies of itself and sends each new task a part of
the X and Y arrays. The message contains the length of the subarrays
in the message and the subarrays themselves. After the master spawns
the worker processes and sends out the subvectors, the master then
computes the dot product on its portion of X and Y. The master process
then receives the other local dot products from the worker processes.
Notice that the PVMFRECV call uses a wildcard **(-1)** for the task id
parameter. This indicates that a message from *any* task will
satisfy the receive. Using the wildcard in this manner results in a
race condition. In this case the race condition does not cause a
problem since addition is commutative. In other words, it doesn't
matter in which order we add the partial sums from the workers.
Unless one is certain that the race will not have an adverse effect on
the program, race conditions should be avoided.

Once the master receives all the local dot products and sums them into a global dot product, it then calculates the entire dot product locally. These two results are then subtracted, and the difference between the two values is printed. A small difference can be expected because of the variation in floating-point roundoff errors.

If the PSDOT program is a worker then it receives a message from the master process containing subarrays of X and Y. It calculates the dot product of these subarrays and sends the result back to the master process. In the interests of brevity we do not include the SGENMAT and SDOT subroutines.