1/******************************************************************************
2* OpenMP Example - Matrix-vector multiplication - C/C++ Version
3* FILE: omp_matvec.c
4* DESCRIPTION:
5*   This example multiplies all row i elements of matrix A with vector
6*   element b(i) and stores the summed products in vector c(i).  A total is
7*   maintained for the entire matrix.  Performed by using the OpenMP loop
8*   work-sharing construct.  The update of the shared global total is
9*   serialized by using the OpenMP critical directive.
10* SOURCE: Blaise Barney  5/99
11* LAST REVISED:
12******************************************************************************/
13
14#include <omp.h>
15#include <stdio.h>
16#define SIZE 10
17
18
19int
20main ()
21{
22
23float A[SIZE][SIZE], b[SIZE], c[SIZE], total;
24int i, j, tid;
25
26/* Initializations */
27total = 0.0;
28for (i=0; i < SIZE; i++)
29  {
30  for (j=0; j < SIZE; j++)
31    A[i][j] = (j+1) * 1.0;
32  b[i] = 1.0 * (i+1);
33  c[i] = 0.0;
34  }
35printf("\nStarting values of matrix A and vector b:\n");
36for (i=0; i < SIZE; i++)
37  {
38  printf("  A[%d]= ",i);
39  for (j=0; j < SIZE; j++)
40    printf("%.1f ",A[i][j]);
41  printf("  b[%d]= %.1f\n",i,b[i]);
42  }
43printf("\nResults by thread/row:\n");
44
45/* Create a team of threads and scope variables */
46#pragma omp parallel shared(A,b,c,total) private(tid,i)
47  {
48  tid = omp_get_thread_num();
49
50/* Loop work-sharing construct - distribute rows of matrix */
51#pragma omp for private(j)
52  for (i=0; i < SIZE; i++)
53    {
54    for (j=0; j < SIZE; j++)
55      c[i] += (A[i][j] * b[i]);
56
57    /* Update and display of running total must be serialized */
58    #pragma omp critical
59      {
60      total = total + c[i];
61      printf("  thread %d did row %d\t c[%d]=%.2f\t",tid,i,i,c[i]);
62      printf("Running total= %.2f\n",total);
63      }
64
65    }   /* end of parallel i loop */
66
67  } /* end of parallel construct */
68
69printf("\nMatrix-vector total - sum of all c[] = %.2f\n\n",total);
70
71  return 0;
72}
73
74