[Osi] osicpx threaded

Matthew Saltzman mjs at clemson.edu
Tue Sep 15 10:18:46 EDT 2009


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




More information about the Osi mailing list