[Cbc] Threadsafe usage of Cbc

Pietro Belotti petr.7b6 at gmail.com
Thu Dec 19 13:59:12 EST 2013


A bit more information about Couenne: there is some code in Couenne to
make it possible, in the future, to use threads (for instance, it can
be configured with --enable-cbc-parallel), but as far as I understand
Couenne is still sequential. There are a few major changes to be made
for this to happen. I was able to code a Branch-and-bound for problems
with a specific class of nonlinear constraints and it does run in
parallel (under Linux only), but that's that.

Pietro

On Thu, Dec 19, 2013 at 3:44 PM, Cornelius Riemenschneider
<cri at itscope.de> wrote:
> Hello,
>
> thank you very much for your work!
>
> As I’ll be away for the holidays, I’ll try your patch in the new year and
> will report back.
>
> Can you elaborate on the cut generator problem? Is it user-specified which
> one is used, or is this a choice done by the algorithm?
>
> And can you point me at the source code for them, so that I can check them
> for thread safety in case we actually use them?
>
>
>
> Regards,
>
> Cornelius Riemenschneider
>
> --
>
> ITscope GmbH
>
> Ludwig-Erhard-Allee 20
>
> 76131 Karlsruhe
>
> Email: cornelius.riemenschneider at itscope.de
>
> https://www.itscope.com
>
> Handelsregister: AG Mannheim, HRB 232782
>
> Sitz der Gesellschaft: Karlsruhe
>
> Geschäftsführer: Alexander Münkel, Benjamin Mund, Stefan Reger
>
>
>
> Von: john.forrest at fastercoin.com [mailto:cbc-bounces at list.coin-or.org] Im
> Auftrag von John Forrest
> Gesendet: Mittwoch, 18. Dezember 2013 14:23
> An: cbc at list.coin-or.org
>
>
> Betreff: Re: [Cbc] Threadsafe usage of Cbc
>
>
>
> Cornelius,
>
>
>
> I have made some changes, which I hope will be enough for you.  I have done
> the minimum amount of work.
>
> I don't think they can hurt anyone but as Ted Ralphs is preparing a new
> release, I will delay updating Cbc/stable/CbcSolver.?pp for a day or two.
> If anyone wants to test the code I attach CbcSolver.?pp.
>
> You need to compile with -DCBC_THREAD_SAFE.  The main thing this does is
> that Cbc only reads argv/argc type parameters in a crude threadsafe way.
> You also need to use alternative versions of CbcMain0/1.
>
> parallel.cpp has been added to Cbc/examples which is a simple example.
>
> Please tell me if there are any problems.  Some lesser used Cgl cut
> generators may not be threadsafe, but I think the commonly used ones are.
>
> John Forrest
>
>
> On 17/12/13 15:11, Cornelius Riemenschneider wrote:
>
> Hello,
>
> we use CBC via googles or-tools from java in our application.
>
> Compared to scientific problems, our problems are small and solved by Cbc in
> <1s (which is great!).
>
> As we process requests from users concurrently, we’d also like to call Cbc
> concurrently.
>
> Currently, this is impossible, because Cbc uses the static parameters array
> in CbcMain0 and CbcMain1 and thus crashes or reads incorrect parameters.
>
> One backtrace, for example is:
>
>
>
> #2 0x00007fb3435bf52b in __libc_message (do_abort=<optimized out>,
> fmt=<optimized out>) at ../sysdeps/unix/sysv/linux/libc_fatal.c:189
> #3 0x00007fb3435c8d76 in malloc_printerr (action=3, str=0x7fb3436a1248
> "double free or corruption (!prev)", ptr=<optimized out>) at malloc.c:6283
> #4 0x00007fb3435cdaac in *__GI___libc_free (mem=<optimized out>) at
> malloc.c:3738
> #5 0x00007fb342733f06 in std::string::assign(std::string const&) () from
> /usr/lib/x86_64-linux-gnu/libstdc++.so.6
> #6 0x00007fb2d652cb7b in establishParams(int&, CbcOrClpParam*) () from
> libjnilinearsolver.so
> #7 0x00007fb2d64edc3b in CbcMain0(CbcModel&) () from libjnilinearsolver.so
> #8 0x00007fb2d6511bec in callCbc(char const*, CbcModel&) () from
> libjnilinearsolver.so
> #9 0x00007fb2d64e3fce in
> operations_research::CBCInterface::Solve(operations_research::MPSolverParameters
> const&) () from libjnilinearsolver.so
> #10 0x00007fb2d64cfe45 in
> operations_research::MPSolver::Solve(operations_research::MPSolverParameters
> const&) () from libjnilinearsolver.so
> #11 0x00007fb2d64cff3b in operations_research::MPSolver::Solve() () from
> libjnilinearsolver.so
> #12 0x00007fb2d64c91cf in
> Java_com_google_ortools_linearsolver_mainJNI_MPSolver_1solve_1_1SWIG_10 ()
> from libjnilinearsolver.so
>
> # from here on it’s just the JVM
>
>
>
> As I don’t know the code and it’s hard to read, I can’t really fix the
> problem by myself,
>
> but wouldn’t it be better to move parameters inside CbcModel instead of
> having a static array laying around?
>
>
>
> Andi f that’s done (or another solution is found), do you know of any
> thread-safety issues in cbc?
>
> Keep in mind, we don’t want Cbc to solve our problem in multiple threads, we
> just want to be able to solve different problems simultaneous.
>
>
>
> Regards,
>
> Cornelius Riemenschneider
>
> --
>
> ITscope GmbH
>
> Ludwig-Erhard-Allee 20
>
> 76131 Karlsruhe
>
> Email: cornelius.riemenschneider at itscope.de
>
> https://www.itscope.com
>
> Handelsregister: AG Mannheim, HRB 232782
>
> Sitz der Gesellschaft: Karlsruhe
>
> Geschäftsführer: Alexander Münkel, Benjamin Mund, Stefan Reger
>
>
>
>
>
>
> _______________________________________________
>
> Cbc mailing list
>
> Cbc at list.coin-or.org
>
> http://list.coin-or.org/mailman/listinfo/cbc
>
>
>
>
> _______________________________________________
> Cbc mailing list
> Cbc at list.coin-or.org
> http://list.coin-or.org/mailman/listinfo/cbc
>



More information about the Cbc mailing list