1 /******************************************************************************
2 * OpenMP Example - Matrix-vector multiplication - C/C++ Version
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
12 ******************************************************************************/
22 float A[SIZE][SIZE], b[SIZE], c[SIZE], total;
27 for (i=0; i < SIZE; i++)
29 for (j=0; j < SIZE; j++)
30 A[i][j] = (j+1) * 1.0;
34 printf("\nStarting values of matrix A and vector b:\n");
35 for (i=0; i < SIZE; i++)
38 for (j=0; j < SIZE; j++)
39 printf("%.1f ",A[i][j]);
40 printf(" b[%d]= %.1f\n",i,b[i]);
42 printf("\nResults by thread/row:\n");
44 /* Create a team of threads and scope variables */
45 #pragma omp parallel shared(A,b,c,total) private(tid,i)
47 tid = omp_get_thread_num();
49 /* Loop work-sharing construct - distribute rows of matrix */
50 #pragma omp for private(j)
51 for (i=0; i < SIZE; i++)
53 for (j=0; j < SIZE; j++)
54 c[i] += (A[i][j] * b[i]);
56 /* Update and display of running total must be serialized */
60 printf(" thread %d did row %d\t c[%d]=%.2f\t",tid,i,i,c[i]);
61 printf("Running total= %.2f\n",total);
64 } /* end of parallel i loop */
66 } /* end of parallel construct */
68 printf("\nMatrix-vector total - sum of all c[] = %.2f\n\n",total);