[Osi] osicpx threaded

Matthew Galati magh at lehigh.edu
Tue Sep 15 11:19:58 EDT 2009


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<http://www.math.clemson.edu/%7Emjs>
> >
> >
> >
> --
>                 Matthew Saltzman
>
> Clemson University Math Sciences
> mjs AT clemson DOT edu
> http://www.math.clemson.edu/~mjs <http://www.math.clemson.edu/%7Emjs>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://list.coin-or.org/pipermail/osi/attachments/20090915/5ae38f74/attachment.html>


More information about the Osi mailing list