[gecode-users] Multithreading executions crash

Andrea Peano andrea.peano at unife.it
Tue Apr 15 17:07:31 CEST 2014


Thanks for your reply.

I tried to simplify my real architecture, maybe too much!

I create a "backup" space before starting the search, that is a copy of the
original space used during the search, and it is a global variable of the
code.

Within the ::post function I create a copy of the backup model, I update
this space by passing the current (partial) solution, and then I search the
first sol, like that:
MyModel *inner_model=static_cast<MyModel *>(backup->clone(true));
inner_model->update_variables(this->partial_sol_values());
inner_model->status();
...
inner_dfs.next();

Scary stuff again, I guess!

In general, I need of a partial solution before starting the second step in
order to run some scary heuristics :)

You refer to this discussion:
http://www.gecode.org/pipermail/users/2013-January/003769.html
don't you?

Thanks,
Andrea


On Tue, Apr 15, 2014 at 4:27 PM, Christian Schulte <cschulte at kth.se> wrote:

> Hi Andrea,
>
>
>
> Whoa! Scary stuff ;-) That's not possible to clone a space that is
> currently in use for propagation (because that is what is still going on
> when the ::post function is executed).
>
>
>
> However it should work much much easier: there has been a discussion in
> this users group a while ago on how to split search into two parts. Then
> you can parallelize each one. Just go through the archive (or maybe one of
> the users who took part in the discussion can help here).
>
>
>
> Cheers
>
> Christian
>
>
>
> --
>
> Christian Schulte, Professor of Computer Science, KTH,
> www.ict.kth.se/~cschulte/
>
>
>
> *From:* users-bounces at gecode.org [mailto:users-bounces at gecode.org] *On
> Behalf Of *Andrea Peano
> *Sent:* Tuesday, April 15, 2014 2:35 PM
> *To:* users at gecode.org
> *Subject:* [gecode-users] Multithreading executions crash
>
>
>
> Hello everyone,
>
> my model is solved by a two-steps search. The first step can be a DFS as
> well as a BAB search, the second step is always a DFS.
>
>
>
> I implemented this search by following the section "Executing code between
> branchers" of the Gecode's guide, like this:
>
> branch(*this, MyModel::post)
>
>
>
> The function "post" copies the current space into a local variable, then
> instantiates a new DFS engine and finally calls the method "next", in order
> to compute only the first solution.
>
>
>
> MyModel *inner_model=static_cast<MyModel *>(this->clone(true));
>
> inner_model->status();
>
> ...
>
> inner_dfs.next();
>
>
>
> The idea is to parallelize the first level of the search... but if I use
> only one thread everything works fine, otherwise every time the execution
> crashes on a different instruction of the function "post".
>
>
>
> Do you have any clue about this behavior?
>
> The worst scenario I see is that this solving architecture is totally
> incompatible with the multithreading system implemented in Gecode.
>
>
>
> Thanks,
>
> Andrea
>



-- 

Andrea Peano - PhD student
Department of Engineering - University of Ferrara
Tel: +39 0532 97 4827
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.gecode.org/pipermail/users/attachments/20140415/90037855/attachment-0001.html>


More information about the users mailing list