/* 09-mutex.c (see also setaffin_not.c, same serial version)
This is a simple serial program which computes the dot product of two
vectors, namely 'a' and 'b' in DOTDATA. The threaded version is 10-mutex.c.
Author: Vijay Sonnad, IBM, last revised: 01/29/09 Blaise Barney
*/
#include
#include
/*
The following structure contains the necessary information
to allow the function "dotprod" to access its input data and
place its output so that it can be accessed later.
*/
typedef struct {
double *a, *b, sum;
int veclen;
} DOTDATA;
#define VECLEN 100000
DOTDATA dotstr;
/*
The function (dotprod) is used to perform the scalar product.
All input to this routine is obtained through a structure of
type DOTDATA and all output from this function is written into
this same structure. While this is unnecessarily restrictive
for a sequential program, it will turn out to be useful when
the program is modified to compute in parallel.
*/
void dotprod() {
/* Define and use local variables for convenience */
int start, end, i, j;
double mysum, *x, *y;
start=0;
end = dotstr.veclen;
x = dotstr.a; /* one vector */
y = dotstr.b; /* second vector */
/*
Perform the dot product and assign result
to the appropriate variable in the structure.
*/
for (j=0 ; j < 2000 ; j++) {
mysum = 0;
for (i=start ; i < end ; i++) mysum += (x[i] * y[i]);
dotstr.sum = mysum;
}
}
/*
The main program initializes data and calls the dotprd() function.
Finally, it prints the result.
*/
int main (int argc, char *argv[]) {
int i,len;
double *a, *b;
/* Assign storage and initialize values */
len = VECLEN;
a = (double*) malloc(len*sizeof(double));
b = (double*) malloc(len*sizeof(double));
for (i=0 ; i < len ; i++) a[i] = b[i] = 1;
dotstr.veclen = len;
dotstr.a = a;
dotstr.b = b;
dotstr.sum=0;
/* Perform the dotproduct */
dotprod ();
/* Print result and release storage */
printf ("Sum = %f \n", dotstr.sum);
free (a);
free (b);
}