OpenMP loop optimization

General OpenMP discussion

OpenMP loop optimization

Postby SeByDocKy » Sun Nov 06, 2011 12:26 am

Hi,

I use like to optimize these two loops but actually my openMP version is slower that the serial one. Any help for me ?


Code: Select all
#pragma omp parallel for default(none) private(j,l,jd,temp) shared(X,yproto_est,Wproto_est,lambda_est,dist_proto,yi,d,Nproto,kmin,lmin,dkmin,dlmin,ind)

            for(j = 0 ; j < Nproto ; j++)
            {
               dist_proto  = 0.0;   
               jd          = j*d;
               for(l = 0 ; l < d ; l++)
               {
                  temp        = (X[l + ind] - Wproto_est[l + jd]);
                  dist_proto += (lambda_est[l]*temp*temp);                  
               }
               if(yproto_est[j] == yi)
               {   
                  if(dist_proto < dkmin)      
                  {
                     dkmin = dist_proto;   
                     kmin  = j;
                  }
               }
               else
               {
                  if(dist_proto < dlmin)      
                  {
                     dlmin = dist_proto;   
                     lmin  = j;
                  }
               }
            }
         }


SeByDocKy
 
Posts: 4
Joined: Thu Jan 06, 2011 9:59 am

Re: OpenMP loop optimization

Postby ftinetti » Mon Nov 07, 2011 5:06 am

Hi,

1) At least, you have race conditions on variables
distproto, dkmin, kmin, dlmin, and lmin
2) How are you measuring time? I suggest you use omp_get_wtime()

HTH.
ftinetti
 
Posts: 582
Joined: Wed Feb 10, 2010 2:44 pm

Re: OpenMP loop optimization

Postby SeByDocKy » Wed Nov 09, 2011 12:26 pm

HTH,

I am measuring through my Matlab, in fact part of code correspond to a part of a mex-file. I wrote many mex with openMP support, working fine. Except this one ...
SeByDocKy
 
Posts: 4
Joined: Thu Jan 06, 2011 9:59 am

Re: OpenMP loop optimization

Postby MarkB » Thu May 03, 2012 9:50 am

This loop is a bit trickier to parallelise than you think! You need to do something like this:

Code: Select all
#pragma omp parallel default(none) private(j,l,jd,temp, dist_proto, t_dkmin, t_dlmin, t_lmin, t_kmin)\ shared(X,yproto_est,Wproto_est,lambda_est,yi,d,Nproto,kmin,lmin,dkmin,dlmin,ind)
{
                t_dkmin  = dkmin;
                t_dlmin = dlmin;
#pragma omp for
                for(j = 0 ; j < Nproto ; j++)
                {
                   dist_proto  = 0.0;   
                   jd          = j*d;
                   for(l = 0 ; l < d ; l++)
                   {
                      temp        = (X[l + ind] - Wproto_est[l + jd]);
                      dist_proto += (lambda_est[l]*temp*temp);                 
                   }
                   if(yproto_est[j] == yi)
                   {   
                      if(dist_proto < t_dkmin)     
                      {
                         t_dkmin = dist_proto;   
                         t_kmin  = j;
                      }
                   }
                   else
                   {
                      if(dist_proto < t_dlmin)     
                      {
                         t_dlmin = dist_proto;   
                         t_lmin  = j;
                      }
                   }
                }

#pragma omp critical
               {
               if (t_dkmin < dkmin)
                  {
                     dkmin = t_dkmin;
                     kmin = t_kmin;
                  }
               if (t_dlmin < dlmin)
                  {
                     dlmin = t_dlmin;
                     lmin = t_lmin;
                  }
               }

}


(Note: you could have used a reduction clause for dlmin and dkmin if it weren't for the problem of needing the locations of the minima as well). This should perform OK if Nproto and/or d are large enough: let us know how you get on.
MarkB
 
Posts: 479
Joined: Thu Jan 08, 2009 10:12 am
Location: EPCC, University of Edinburgh


Return to Using OpenMP

Who is online

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