1+ #include <stdio.h>
2+ #include <stdlib.h>
3+ #include <string.h>
4+
5+ #include <omp.h>
6+
7+ // define the dimensions of the matrix
8+ #define M 384
9+ #define N 512
10+
11+ /* Read the numbers in the file as an m x n matrix
12+ Note: If the file has fewer elements than in matrix, the rest is filled with zeroes. */
13+ int * * readMatrix (const char * filename , int m , int n );
14+
15+ const int const NUM_THREADS [] = {1 , 2 , 4 , 6 , 8 , 12 , 16 , 20 , 24 , 28 , 32 };
16+
17+ int main (void )
18+ {
19+ int i , j ;
20+
21+ // read random image matrices from file 'red.txt', 'green.txt', 'blue.txt'
22+ int * * redmatrix = readMatrix ("../../data/red.txt" , M , N );
23+ int * * greenmatrix = readMatrix ("../../data/green.txt" , M , N );
24+ int * * bluematrix = readMatrix ("../../data/blue.txt" , M , N );
25+
26+ // create matrices to store mean filtering result for red, green, blue matrices
27+ int * * redmeanfilteredmatrix , * * greenmeanfilteredmatrix , * * bluemeanfilteredmatrix ;
28+
29+ redmeanfilteredmatrix = (int * * )malloc (sizeof (int * )* (M - 4 ));
30+ greenmeanfilteredmatrix = (int * * )malloc (sizeof (int * )* (M - 4 ));
31+ bluemeanfilteredmatrix = (int * * )malloc (sizeof (int * )* (M - 4 ));
32+
33+ for (i = 0 ; i < (M - 4 ); ++ i )
34+ {
35+ * (redmeanfilteredmatrix + i ) = (int * )malloc (sizeof (int )* (N - 4 ));
36+ * (greenmeanfilteredmatrix + i ) = (int * )malloc (sizeof (int )* (N - 4 ));
37+ * (bluemeanfilteredmatrix + i ) = (int * )malloc (sizeof (int )* (N - 4 ));
38+ }
39+
40+
41+ int num_threads_index ;
42+ double start_time , end_time ;
43+
44+ for (num_threads_index = 0 ; num_threads_index < sizeof (NUM_THREADS )/sizeof (int ); ++ num_threads_index )
45+ {
46+ start_time = omp_get_wtime ();
47+
48+ // perform mean filtering on the matrices
49+ #pragma omp parallel sections
50+ {
51+ #pragma omp section
52+ {
53+ #pragma omp parallel for default(none) shared(redmeanfilteredmatrix, redmatrix) private(i, j) num_threads(NUM_THREADS[num_threads_index]) collapse(2)
54+ for (i = 0 ; i < (M - 4 ); ++ i )
55+ for (j = 0 ; j < (N - 4 ); ++ j )
56+ * (* (redmeanfilteredmatrix + i ) + j ) = 0.04 * * (* (redmatrix + i )+ j ) + 0.04 * * (* (redmatrix + i )+ j + 1 ) + 0.04 * * (* (redmatrix + i )+ j + 2 ) + 0.04 * * (* (redmatrix + i )+ j + 3 ) + 0.04 * * (* (redmatrix + i )+ j + 4 ) + 0.04 * * (* (redmatrix + i + 1 )+ j ) + 0.04 * * (* (redmatrix + i + 1 )+ j + 1 ) + 0.04 * * (* (redmatrix + i + 1 )+ j + 2 ) + 0.04 * * (* (redmatrix + i + 1 )+ j + 3 ) + 0.04 * * (* (redmatrix + i + 1 )+ j + 4 ) + 0.04 * * (* (redmatrix + i + 2 )+ j ) + 0.04 * * (* (redmatrix + i + 2 )+ j + 1 ) + 0.04 * * (* (redmatrix + i + 2 )+ j + 2 ) + 0.04 * * (* (redmatrix + i + 2 )+ j + 3 ) + 0.04 * * (* (redmatrix + i + 2 )+ j + 4 ) + 0.04 * * (* (redmatrix + i + 3 )+ j ) + 0.04 * * (* (redmatrix + i + 3 )+ j + 1 ) + 0.04 * * (* (redmatrix + i + 3 )+ j + 2 ) + 0.04 * * (* (redmatrix + i + 3 )+ j + 3 ) + 0.04 * * (* (redmatrix + i + 3 )+ j + 4 ) + 0.04 * * (* (redmatrix + i + 4 )+ j ) + 0.04 * * (* (redmatrix + i + 4 )+ j + 1 ) + 0.04 * * (* (redmatrix + i + 4 )+ j + 2 ) + 0.04 * * (* (redmatrix + i + 4 )+ j + 3 ) + 0.04 * * (* (redmatrix + i + 4 )+ j + 4 );
57+ }
58+
59+ #pragma omp section
60+ {
61+ #pragma omp parallel for default(none) shared(greenmeanfilteredmatrix, greenmatrix) private(i, j) num_threads(NUM_THREADS[num_threads_index]) collapse(2)
62+ for (i = 0 ; i < (M - 4 ); ++ i )
63+ for (j = 0 ; j < (N - 4 ); ++ j )
64+ * (* (greenmeanfilteredmatrix + i ) + j ) = 0.04 * * (* (greenmatrix + i )+ j ) + 0.04 * * (* (greenmatrix + i )+ j + 1 ) + 0.04 * * (* (greenmatrix + i )+ j + 2 ) + 0.04 * * (* (greenmatrix + i )+ j + 3 ) + 0.04 * * (* (greenmatrix + i )+ j + 4 ) + 0.04 * * (* (greenmatrix + i + 1 )+ j ) + 0.04 * * (* (greenmatrix + i + 1 )+ j + 1 ) + 0.04 * * (* (greenmatrix + i + 1 )+ j + 2 ) + 0.04 * * (* (greenmatrix + i + 1 )+ j + 3 ) + 0.04 * * (* (greenmatrix + i + 1 )+ j + 4 ) + 0.04 * * (* (greenmatrix + i + 2 )+ j ) + 0.04 * * (* (greenmatrix + i + 2 )+ j + 1 ) + 0.04 * * (* (greenmatrix + i + 2 )+ j + 2 ) + 0.04 * * (* (greenmatrix + i + 2 )+ j + 3 ) + 0.04 * * (* (greenmatrix + i + 2 )+ j + 4 ) + 0.04 * * (* (greenmatrix + i + 3 )+ j ) + 0.04 * * (* (greenmatrix + i + 3 )+ j + 1 ) + 0.04 * * (* (greenmatrix + i + 3 )+ j + 2 ) + 0.04 * * (* (greenmatrix + i + 3 )+ j + 3 ) + 0.04 * * (* (greenmatrix + i + 3 )+ j + 4 ) + 0.04 * * (* (greenmatrix + i + 4 )+ j ) + 0.04 * * (* (greenmatrix + i + 4 )+ j + 1 ) + 0.04 * * (* (greenmatrix + i + 4 )+ j + 2 ) + 0.04 * * (* (greenmatrix + i + 4 )+ j + 3 ) + 0.04 * * (* (greenmatrix + i + 4 )+ j + 4 );
65+ }
66+
67+ #pragma omp section
68+ {
69+ #pragma omp parallel for default(none) shared(bluemeanfilteredmatrix, bluematrix) private(i, j) num_threads(NUM_THREADS[num_threads_index]) collapse(2)
70+ for (i = 0 ; i < (M - 4 ); ++ i )
71+ for (j = 0 ; j < (N - 4 ); ++ j )
72+ * (* (bluemeanfilteredmatrix + i ) + j ) = 0.04 * * (* (bluematrix + i )+ j ) + 0.04 * * (* (bluematrix + i )+ j + 1 ) + 0.04 * * (* (bluematrix + i )+ j + 2 ) + 0.04 * * (* (bluematrix + i )+ j + 3 ) + 0.04 * * (* (bluematrix + i )+ j + 4 ) + 0.04 * * (* (bluematrix + i + 1 )+ j ) + 0.04 * * (* (bluematrix + i + 1 )+ j + 1 ) + 0.04 * * (* (bluematrix + i + 1 )+ j + 2 ) + 0.04 * * (* (bluematrix + i + 1 )+ j + 3 ) + 0.04 * * (* (bluematrix + i + 1 )+ j + 4 ) + 0.04 * * (* (bluematrix + i + 2 )+ j ) + 0.04 * * (* (bluematrix + i + 2 )+ j + 1 ) + 0.04 * * (* (bluematrix + i + 2 )+ j + 2 ) + 0.04 * * (* (bluematrix + i + 2 )+ j + 3 ) + 0.04 * * (* (bluematrix + i + 2 )+ j + 4 ) + 0.04 * * (* (bluematrix + i + 3 )+ j ) + 0.04 * * (* (bluematrix + i + 3 )+ j + 1 ) + 0.04 * * (* (bluematrix + i + 3 )+ j + 2 ) + 0.04 * * (* (bluematrix + i + 3 )+ j + 3 ) + 0.04 * * (* (bluematrix + i + 3 )+ j + 4 ) + 0.04 * * (* (bluematrix + i + 4 )+ j ) + 0.04 * * (* (bluematrix + i + 4 )+ j + 1 ) + 0.04 * * (* (bluematrix + i + 4 )+ j + 2 ) + 0.04 * * (* (bluematrix + i + 4 )+ j + 3 ) + 0.04 * * (* (bluematrix + i + 4 )+ j + 4 );
73+ }
74+ }
75+
76+
77+ end_time = omp_get_wtime ();
78+ printf ("No. of Threads = %d, time taken = %lf\n" , NUM_THREADS [num_threads_index ], (end_time - start_time ));
79+ }
80+
81+ return 0 ;
82+ }
83+
84+ int * * readMatrix (const char * filename , int m , int n )
85+ {
86+ int * * matrix ;
87+
88+ // open the matrix file for reading
89+ FILE * fptr = fopen (filename , "r" );
90+
91+ if (fptr == NULL )
92+ {
93+ matrix = NULL ;
94+
95+ char * errormsg = (char * )malloc ( sizeof (char )* (30 + strlen (filename ) + 1 ) );
96+ sprintf (errormsg , "Failed to read and parse file %s" , filename );
97+ perror (errormsg );
98+ }
99+
100+ else
101+ {
102+ // create and read the matrix
103+ matrix = (int * * )malloc (sizeof (int * )* m );
104+
105+ int i , j ;
106+ for (i = 0 ; i < m ; ++ i )
107+ {
108+ * (matrix + i ) = (int * )malloc (sizeof (int )* n );
109+ for (j = 0 ; j < n ; ++ j )
110+ fscanf (fptr , "%d" , * (matrix + i )+ j );
111+ }
112+
113+ fclose (fptr );
114+ }
115+
116+ return matrix ;
117+
118+ }
0 commit comments