Doing a reduction with MAX/MIN in C

General OpenMP discussion

Doing a reduction with MAX/MIN in C

Postby rreddy » Thu Feb 14, 2008 11:30 am

From the OpenMP documents (one example below):

https://computing.llnl.gov/tutorials/openMP/#REDUCTION

I see that intrinsics are supported in Fortran on "Reduce" clauses, but not in C! There is a very limited set of operators permitted for reduction clauses in C. Of course C does not have an intrinsic do max/min, but still this is a fairly common operation. So how does one do a "reduction" operation to find MIN or MAX in C in a parallel region?

Is using critical sections the only way to do this?

Thanks!
rreddy
 
Posts: 1
Joined: Thu Feb 14, 2008 11:23 am

Re: Doing a reduction with MAX/MIN in C

Postby ejd » Wed Feb 20, 2008 11:33 am

There has been talk for quite a while about adding min and max as reduction operators for C and C++. However, as you have noted, this has not happened yet. You can do this using the critical construct:

Code: Select all
int largest = 0;
#pragma omp parallel for
for ( int i = 0; i < 1000; i++ ) {
  #pragma omp critical
  if (data[i] > largest
     largest = data[i];
}

This however pretty much serializes your code. Another approach would be to do something like:

Code: Select all
int largest = 0;
#pragma omp parallel for
for ( int i = 0; i < 1000; i++ ) {
   if ( data[i] > largest ) {
     #pragma omp critical
     {
       if ( data[i] > largest ) largest = data[i];
     }
   }
}

This will allow some of your values to be checked without waiting. Another approach would be something like this:

Code: Select all
int largest = 0;
int lp
#pragma omp parallel private(lp)
{
  lp = 0;
  #pragma omp for
  for ( int i = 0; i < 1000; i++) {
    if ( data[i] > lp ) lp = data[i];
  }
  if ( lp > largest ) {
    #pragma critical
    {
      if ( lp > largest ) largest = lp;
    }
  }
}

This would allow each thread to find the largest value for it's portion of the array and then the only part that needs to be protected with a critical construct is the comparison between the threads. This is for example purposes only and you will need to find out what works best for you.
ejd
 
Posts: 1025
Joined: Wed Jan 16, 2008 7:21 am


Return to Using OpenMP

Who is online

Users browsing this forum: Google [Bot] and 14 guests