[Osi] osicpx threaded

Matthew Saltzman mjs at clemson.edu
Tue Sep 15 12:56:58 EDT 2009


On Tue, 2009-09-15 at 12:46 -0400, Matthew Galati wrote:
> Ok. I figured out the difference. In my application, I have 1 LP
> (master) and many MILPs (subproblems). Each one is its own OsiCpx. For
> the master, I shut off presolve. I did not want this shut off for the
> MILPs. However, give the current OsiCpx setup, there is only one
> CpxEnv and parameters in Cpx are set through that env. So, when I
> shutoff presolve in the master it shut off presolve everywhere!
> Besides the threading issue, this is another reason I would think that
> we do not want one static env in OsiCpx. 

Yes, that's pretty bad.  Not sure how it's been missed all this time,
but thanks for tracking it down.

> 
> I will post patch to ticket.

Thanks.

> 
> 
> 
> 
>         Will do. But I am investigating some odd behavior. The duals I
>         get from CPX after a few iterations of my algorithm are
>         different with this patch versus without. I don't understand
>         why since the only change was to move the env/lp vars from
>         static to class members. I will get back to you. 
>         
>         
>         
>         
>         
>                 On Mon, 2009-09-14 at 22:59 -0400, Matthew Galati
>                 wrote:
>                 > Here's a patch (against Osi releases 0.100.0) for
>                 what I did to make
>                 > it thread-safe (at least fixing the obvious stuff).
>                 
>                 
>                 Thanks, Matt.  Can you add the patch to the ticket? 
>                 
>                 
>                 >
>                 > Thanks,
>                 > Matt
>                 >
>                 >
>                 >
>                 >
>                 >
>                 > magh at shark:~/COIN/coin-Decomp/Osi/src/OsiCpx$ svn
>                 diff
>                 > OsiCpxSolverInterface.cpp
>                 > Index: OsiCpxSolverInterface.cpp
>                 >
>                 ===================================================================
>                 > --- OsiCpxSolverInterface.cpp   (revision 1399)
>                 > +++ OsiCpxSolverInterface.cpp   (working copy)
>                 > @@ -30,7 +30,7 @@
>                 >  #include "CoinWarmStartBasis.hpp"
>                 >
>                 >
>                 > -// #define DEBUG 1
>                 > +//#define DEBUG 1
>                 >
>                 >  #ifdef DEBUG
>                 >  #define debugMessage printf
>                 > @@ -1291,6 +1291,7 @@
>                 >            {
>                 >               double *rowslack = new double[nrows];
>                 >               int err = CPXgetmipslack( env_,
>                 getMutableLpPtr(),
>                 > rowslack, 0, nrows-1 );
>                 > +            printf("err=%d\n", err);
>                 >               if ( err == CPXERR_NO_SOLN || err ==
>                 > CPXERR_NO_INT_SOLN )
>                 >                  CoinFillN( rowact_, nrows, 0.0 );
>                 >               else
>                 > @@ -1304,6 +1305,7 @@
>                 >            else
>                 >            {
>                 >               int err = CPXgetax( env_,
>                 getMutableLpPtr(), rowact_, 0,
>                 > nrows-1 );
>                 > +            printf("err2=%d\n", err);
>                 >               if ( err == CPXERR_NO_SOLN )
>                 >                  CoinFillN( rowact_, nrows, 0.0 );
>                 >               else
>                 > @@ -2558,8 +2560,10 @@
>                 >
>                 >  void
>                 OsiCpxSolverInterface::incrementInstanceCounter()
>                 >  {
>                 > -  if ( numInstances_ == 0 )
>                 > -    {
>                 > +   printf("numInstances_ = %d\n", numInstances_);
>                 > +   //MVG
>                 > +   if ( numInstances_ == 0 )
>                 > +   {
>                 >        int err;
>                 >
>                 >  #if CPX_VERSION >= 800
>                 > @@ -2568,6 +2572,8 @@
>                 >        env_ = CPXopenCPLEXdevelop( &err );
>                 >  #endif
>                 >
>                 > +      printf("open env = %p\n", env_);
>                 > +
>                 >        checkCPXerror( err, "CPXopenCPLEXdevelop",
>                 > "incrementInstanceCounter" );
>                 >        assert( env_ != NULL );
>                 >  #ifndef NDEBUG
>                 > @@ -2580,7 +2586,7 @@
>                 >        //CPXsetlogfile( env_, fp );
>                 >        err = sscanf( CPXversion( env_ ), "%d.%d.%d",
>                 > &cpxVersionMajor_, &cpxVersionMinor_,
>                 &cpxVersionMinorMinor_ );
>                 >        assert( err == 3 );
>                 > -    }
>                 > +   }
>                 >    numInstances_++;
>                 >  }
>                 >
>                 > @@ -2636,7 +2642,13 @@
>                 >      matrixByCol_(NULL),
>                 >      coltype_(NULL),
>                 >      coltypesize_(0),
>                 > -    probtypemip_(false)
>                 > +    probtypemip_(false),
>                 > +    //MVG
>                 > +    env_(NULL),
>                 > +    cpxVersionMajor_(0),
>                 > +    cpxVersionMinor_(0),
>                 > +    cpxVersionMinorMinor_(0),
>                 > +    numInstances_(0)
>                 >  {
>                 >
>                  debugMessage("OsiCpxSolverInterface::OsiCpxSolverInterface()\n");
>                 >
>                 > @@ -2805,12 +2817,13 @@
>                 >
>                  //------------------------------------------------------------------
>                 >  // Static data
>                 >
>                  //------------------------------------------------------------------
>                 > -CPXENVptr OsiCpxSolverInterface::env_ = NULL;
>                 > +//CPXENVptr OsiCpxSolverInterface::env_ = NULL;
>                 >
>                 > -int OsiCpxSolverInterface::cpxVersionMajor_ = 0;
>                 > -int OsiCpxSolverInterface::cpxVersionMinor_ = 0;
>                 > -int OsiCpxSolverInterface::cpxVersionMinorMinor_ =
>                 0;
>                 > -unsigned int OsiCpxSolverInterface::numInstances_ =
>                 0;
>                 > +//MVG
>                 > +//int OsiCpxSolverInterface::cpxVersionMajor_ = 0;
>                 > +//int OsiCpxSolverInterface::cpxVersionMinor_ = 0;
>                 > +//int OsiCpxSolverInterface::cpxVersionMinorMinor_
>                 = 0;
>                 > +//unsigned int OsiCpxSolverInterface::numInstances_
>                 = 0;
>                 >
>                 >
>                  //-------------------------------------------------------------------
>                 >  // Get pointer to CPXLPptr.
>                 >
>                 >
>                 >
>                 >
>                 >
>                 > magh at shark:~/COIN/coin-Decomp/Osi/src/OsiCpx$ svn
>                 diff
>                 > OsiCpxSolverInterface.hpp
>                 > Index: OsiCpxSolverInterface.hpp
>                 >
>                 ===================================================================
>                 > --- OsiCpxSolverInterface.hpp   (revision 1399)
>                 > +++ OsiCpxSolverInterface.hpp   (working copy)
>                 > @@ -641,7 +641,8 @@
>                 >        1 from 0.
>                 >        </ul>
>                 >    */
>                 > -  static void incrementInstanceCounter();
>                 > +   //static void incrementInstanceCounter();
>                 > +   void incrementInstanceCounter(); //MVG
>                 >
>                 >    /** CPLEX has a context which should be deleted
>                 after CPLEX calls.
>                 >        This method:
>                 > @@ -651,10 +652,12 @@
>                 >        0 from 1.
>                 >        </ul>
>                 >    */
>                 > -  static void decrementInstanceCounter();
>                 > +   void decrementInstanceCounter();//MVG
>                 > +   //static void decrementInstanceCounter();
>                 >
>                 >    /// Return the number of instances of
>                 instantiated objects using
>                 > CPLEX services.
>                 > -  static unsigned int getNumInstances();
>                 > +  //static unsigned int getNumInstances();
>                 > +   unsigned int getNumInstances();//MVG
>                 >    //@}
>                 >    //@}
>                 >
>                 > @@ -787,13 +790,20 @@
>                 >    /**@name Private static class data */
>                 >    //@{
>                 >    /// CPLEX environment pointer
>                 > -  static CPXENVptr env_;
>                 > +   //static CPXENVptr env_;
>                 > +   CPXENVptr env_; //MVG
>                 >    /// CPLEX version
>                 > -  static int cpxVersionMajor_;
>                 > -  static int cpxVersionMinor_;
>                 > -  static int cpxVersionMinorMinor_;
>                 > +  //static int cpxVersionMajor_;
>                 > +  //static int cpxVersionMinor_;
>                 > +  //static int cpxVersionMinorMinor_;
>                 >    /// Number of live problem instances
>                 > -  static unsigned int numInstances_;
>                 > +  //static unsigned int numInstances_;
>                 > +  /// CPLEX version
>                 > +  int cpxVersionMajor_;
>                 > +  int cpxVersionMinor_;
>                 > +  int cpxVersionMinorMinor_;
>                 > +  /// Number of live problem instances
>                 > +  unsigned int numInstances_;
>                 >    //@}
>                 >
>                 >
>                 >
>                 >
>                 >
>                 >
>                 >
>                 >
>                 >         Ok. Thanks Matt. For the tests I have run so
>                 far, my simple
>                 >         fix of removing all the static vars from
>                 OsiCpx seems to have
>                 >         worked. However, my usage for this case is
>                 very simple. I am
>                 >         essentially just solving the same N models
>                 on T threads over
>                 >         and over again with just a minor problem
>                 modifications. So, I
>                 >         think the thread-safey in my case is
>                 primarly cplex's - which
>                 >         we know that part is fine. The main
>                 "connector" through OSI
>                 >         seems to be the env_, lp_ vars - of which
>                 env_ was static.
>                 >
>                 >         I'll definitely keep my eye out for other
>                 issues and I'll let
>                 >         you know / add tickets.
>                 >
>                 >         Thanks,
>                 >         Matt G
>                 >
>                 >
>                 >
>                 >
>                 >
>                 >                 Matt-
>                 >
>                 >                 I'm not sure that thread safety is
>                 quite that simple.
>                 >                  You may have
>                 >                 eliminated some of the obvious
>                 races, but it wouldn't
>                 >                 surprise me to
>                 >                 find other hidden ones that don't
>                 crop up as
>                 >                 frequently.  OSI really
>                 >                 needs a more comprehensive audit for
>                 thread safety,
>                 >                 which we are aware
>                 >                 of and which is on my agenda.
>                 >
>                 >                 If you have patches that you think
>                 make a good
>                 >                 starting point, I'm glad
>                 >                 to have them.  The best place to
>                 keep them is probably
>                 >                 attached to a
>                 >                 ticket.
>                 >
>                 >                 Thanks.
>                 >
>                 >                                Matt
>                 >
>                 >
>                 >
>                 >
>                 >                 On Fri, 2009-08-28 at 01:57 -0400,
>                 Matthew Galati
>                 >                 wrote:
>                 >                 > FYI. If I remove all the
>                 references to static env_,
>                 >                 version, etc...
>                 >                 > things seem to work fine now.
>                 OsiCpx is then
>                 >                 thread-safe.
>                 >                 >
>                 >                 > Can this be changed? or at least
>                 provided as an
>                 >                 option? It is a shame
>                 >                 > if one cannot use Osi in a
>                 multi-threaded
>                 >                 environment.
>                 >                 >
>                 ________________________________________
>                 >                 > From: osi-bounces at list.coin-or.org
>                 >                 [osi-bounces at list.coin-or.org] On
>                 >                 > Behalf Of Matthew Galati
>                 [magh at lehigh.edu]
>                 >                 > Sent: Thursday, August 27, 2009
>                 11:55 PM
>                 >                 > To: osi at list.coin-or.org
>                 >                 > Subject: [Osi] osicpx threaded
>                 >                 >
>                 >                 > Has anyone successfully used more
>                 than one
>                 >                 instance/thread of OsiCpx
>                 >                 > simultaneously? I am trying to do
>                 this. Constructing
>                 >                 2 instances of
>                 >                 > OsiCpx and using standard
>                 pthreads, solve two MILPs
>                 >                 on 2 threads. It
>                 >                 > crashes. Valgrind/Helgrind is
>                 showing lots of
>                 >                 potential race
>                 >                 > conditions. Looking a little
>                 deeper into OsiCpx, I
>                 >                 noticed that
>                 >                 > although I have two different
>                 CpxLp ptrs, I have one
>                 >                 CpxEnv ptr. In
>                 >                 > fact, the cpx env is a static
>                 variable in OsiCpx.
>                 >                 Doesn't this make
>                 >                 > OsiCpx not thread-safe? Is there
>                 any easy way around
>                 >                 this?
>                 >                 >
>                 >                 > Thanks,
>                 >                 > Matt
>                 >                 >
>                 >                 >
>                 >
>                 >                 >
>                 _______________________________________________
>                 >                 > Osi mailing list
>                 >                 > Osi at list.coin-or.org
>                 >                 >
>                 http://list.coin-or.org/mailman/listinfo/osi
>                 >                 --
>                 >                                Matthew Saltzman
>                 >
>                 >                 Clemson University Math Sciences
>                 >                 mjs AT clemson DOT edu
>                 >                 http://www.math.clemson.edu/~mjs
>                 >
>                 >
>                 >
>                 
>                 -- 
>                 
>                                Matthew Saltzman
>                 
>                 Clemson University Math Sciences
>                 mjs AT clemson DOT edu
>                 http://www.math.clemson.edu/~mjs
>                 
>         
>         
> 
-- 
                Matthew Saltzman

Clemson University Math Sciences
mjs AT clemson DOT edu
http://www.math.clemson.edu/~mjs




More information about the Osi mailing list