[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