mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			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;
 | |
| }
 | |
| 
 |