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