|  | /****************************************************************************** | 
|  | * OpenMP Example - Matrix-vector multiplication - C/C++ Version | 
|  | * FILE: omp_matvec.c | 
|  | * DESCRIPTION: | 
|  | *   This example multiplies all row i elements of matrix A with vector | 
|  | *   element b(i) and stores the summed products in vector c(i).  A total is | 
|  | *   maintained for the entire matrix.  Performed by using the OpenMP loop | 
|  | *   work-sharing construct.  The update of the shared global total is | 
|  | *   serialized by using the OpenMP critical directive. | 
|  | * SOURCE: Blaise Barney  5/99 | 
|  | * LAST REVISED: | 
|  | ******************************************************************************/ | 
|  |  | 
|  | #include <omp.h> | 
|  | #include <stdio.h> | 
|  | #define SIZE 10 | 
|  |  | 
|  |  | 
|  | int | 
|  | main () | 
|  | { | 
|  |  | 
|  | float A[SIZE][SIZE], b[SIZE], c[SIZE], total; | 
|  | int i, j, tid; | 
|  |  | 
|  | /* Initializations */ | 
|  | total = 0.0; | 
|  | for (i=0; i < SIZE; i++) | 
|  | { | 
|  | for (j=0; j < SIZE; j++) | 
|  | A[i][j] = (j+1) * 1.0; | 
|  | b[i] = 1.0 * (i+1); | 
|  | c[i] = 0.0; | 
|  | } | 
|  | printf("\nStarting values of matrix A and vector b:\n"); | 
|  | for (i=0; i < SIZE; i++) | 
|  | { | 
|  | printf("  A[%d]= ",i); | 
|  | for (j=0; j < SIZE; j++) | 
|  | printf("%.1f ",A[i][j]); | 
|  | printf("  b[%d]= %.1f\n",i,b[i]); | 
|  | } | 
|  | printf("\nResults by thread/row:\n"); | 
|  |  | 
|  | /* Create a team of threads and scope variables */ | 
|  | #pragma omp parallel shared(A,b,c,total) private(tid,i) | 
|  | { | 
|  | tid = omp_get_thread_num(); | 
|  |  | 
|  | /* Loop work-sharing construct - distribute rows of matrix */ | 
|  | #pragma omp for private(j) | 
|  | for (i=0; i < SIZE; i++) | 
|  | { | 
|  | for (j=0; j < SIZE; j++) | 
|  | c[i] += (A[i][j] * b[i]); | 
|  |  | 
|  | /* Update and display of running total must be serialized */ | 
|  | #pragma omp critical | 
|  | { | 
|  | total = total + c[i]; | 
|  | printf("  thread %d did row %d\t c[%d]=%.2f\t",tid,i,i,c[i]); | 
|  | printf("Running total= %.2f\n",total); | 
|  | } | 
|  |  | 
|  | }   /* end of parallel i loop */ | 
|  |  | 
|  | } /* end of parallel construct */ | 
|  |  | 
|  | printf("\nMatrix-vector total - sum of all c[] = %.2f\n\n",total); | 
|  |  | 
|  | return 0; | 
|  | } | 
|  |  |