mirror of
https://github.com/autc04/Retro68.git
synced 2024-12-03 10:49:58 +00:00
74 lines
1.9 KiB
C
74 lines
1.9 KiB
C
/******************************************************************************
|
|
* 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;
|
|
}
|
|
|