# include # include # include # include # include int main ( int argc, char *argv[] ); /******************************************************************************/ int main ( int argc, char *argv[] ) /******************************************************************************/ /* Purpose: MAIN is the main program for L1_NORM. */ { int i; int num_threads; int n = 1000; double wtime; double wtime1; double wtime2; float *x; float x_l1_norm; # pragma omp parallel { num_threads = omp_get_num_threads ( ); } printf ( "\n" ); printf ( "L1_NORM:\n" ); printf ( " C version\n" ); printf ( " Number of threads is %d\n", num_threads ); x = ( float * ) malloc ( n * sizeof ( float ) ); /* Set X to random values. */ for ( i = 0; i < n; i++ ) { x[i] = ( float ) rand ( ) / ( float ) RAND_MAX; } /* Compute the l1 norm sequentially. */ wtime1 = omp_get_wtime ( ); x_l1_norm = 0.0; for ( i = 0; i < n; i++ ) { x_l1_norm = x_l1_norm + fabs ( x[i] ); } wtime2 = omp_get_wtime ( ); wtime = wtime2 - wtime1; printf ( "\n" ); printf ( "Sequential calculation:\n" ); printf ( " L1_NORM = %f\n", x_l1_norm ); printf ( " Time = %f\n", wtime ); /* Compute the l1 norm in parallel. */ wtime1 = omp_get_wtime ( ); x_l1_norm = 0.0; # pragma omp parallel private ( i ) shared ( n, x ) reduction ( + : x_l1_norm ) # pragma omp for for ( i = 0; i < n; i++ ) { x_l1_norm = x_l1_norm + fabs ( x[i] ); } wtime2 = omp_get_wtime ( ); wtime = wtime2 - wtime1; printf ( "\n" ); printf ( "Parallel calculation:\n" ); printf ( " L1_NORM = %f\n", x_l1_norm ); printf ( " Time = %f\n", wtime ); free ( x ); return 0; }