i understand the frustation :(<div>i once opened a topic too, asking if a particular case would be thread safe, </div><div>ginac is one of the best symbolic math libraries around, and it has proveed that it works great on large cluster problems, its just that the middle multithreading escenario is missing support, lets hope that in the future there could be plans for doing some work on the thread safety.<br>

<br><div class="gmail_quote">On Mon, Aug 23, 2010 at 12:13 PM, Kraus Philipp <span dir="ltr">&lt;<a href="mailto:philipp.kraus@flashpixx.de">philipp.kraus@flashpixx.de</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

<br>
Am 23.08.2010 um 16:39 schrieb Cristobal Navarro:<div class="im"><br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
in some cases,<br>
parallel symbolic algorithms obtain great performance increase, it all depends how you model the problem.<br>
im using ginac with openMPI to paralelize huge tree generators, i had to go the processes paralelism since multithread is not safe, but would be nice to be able to do that on the future<br>
</blockquote>
<br></div>
I&#39; working with MPI (on boost) and in this case it works on my test system. But I would like to portage my algorithm without MPI support (on a simple desktop system MPI support is not installed, but on these systems I can use multithreading).<br>


I have tried to compile ginac with -pthread on CXXFLAGS and the CLN library. I analyse the compiled code with valgrind, you can show the excerpt:<br>
<br>
==51729== Possible data race during write of size 4 at 0x1ea4564 by thread #3<br>
==51729==    at 0x3AB9: GiNaC::refcounted::add_reference() (in main)<br>
==51729==    by 0xF7C49F: GiNaC::ptr&lt;GiNaC::basic&gt;::ptr(GiNaC::ptr&lt;GiNaC::basic&gt; const&amp;) (in /Developer/opt/Ginac/1.5.8/lib/libginac-1.5.0.dylib)<br>
==51729==    by 0xF7C4B9: GiNaC::ptr&lt;GiNaC::basic&gt;::ptr(GiNaC::ptr&lt;GiNaC::basic&gt; const&amp;) (in /Developer/opt/Ginac/1.5.8/lib/libginac-1.5.0.dylib)<br>
==51729==    by 0xF7C4D3: GiNaC::ex::ex(GiNaC::ex const&amp;) (in /Developer/opt/Ginac/1.5.8/lib/libginac-1.5.0.dylib)<br>
==51729==    by 0xF7C4ED: GiNaC::ex::ex(GiNaC::ex const&amp;) (in /Developer/opt/Ginac/1.5.8/lib/libginac-1.5.0.dylib)<br>
==51729==    by 0xF7C51F: GiNaC::expair::expair(GiNaC::expair const&amp;) (in /Developer/opt/Ginac/1.5.8/lib/libginac-1.5.0.dylib)<br>
==51729==    by 0xF7C539: GiNaC::expair::expair(GiNaC::expair const&amp;) (in /Developer/opt/Ginac/1.5.8/lib/libginac-1.5.0.dylib)<br>
==51729==    by 0xF7E4F3: void std::_Construct&lt;GiNaC::expair, GiNaC::expair&gt;(GiNaC::expair*, GiNaC::expair const&amp;) (in /Developer/opt/Ginac/1.5.8/lib/libginac-1.5.0.dylib)<br>
<br>
==51729==    by 0xF7F3E9: GiNaC::expair* std::__uninitialized_copy_aux&lt;__gnu_cxx::__normal_iterator&lt;GiNaC::expair const*, std::vector&lt;GiNaC::expair, std::allocator&lt;GiNaC::expair&gt; &gt; &gt;, GiNaC::expair*&gt;(__gnu_cxx::__normal_iterator&lt;GiNaC::expair const*, std::vector&lt;GiNaC::expair, std::allocator&lt;GiNaC::expair&gt; &gt; &gt;, __gnu_cxx::__normal_iterator&lt;GiNaC::expair const*, std::vector&lt;GiNaC::expair, std::allocator&lt;GiNaC::expair&gt; &gt; &gt;, GiNaC::expair*, __false_type) (in /Developer/opt/Ginac/1.5.8/lib/libginac-1.5.0.dylib)<br>


<br>
==51729==    by 0xF7F43C: GiNaC::expair* std::uninitialized_copy&lt;__gnu_cxx::__normal_iterator&lt;GiNaC::expair const*, std::vector&lt;GiNaC::expair, std::allocator&lt;GiNaC::expair&gt; &gt; &gt;, GiNaC::expair*&gt;(__gnu_cxx::__normal_iterator&lt;GiNaC::expair const*, std::vector&lt;GiNaC::expair, std::allocator&lt;GiNaC::expair&gt; &gt; &gt;, __gnu_cxx::__normal_iterator&lt;GiNaC::expair const*, std::vector&lt;GiNaC::expair, std::allocator&lt;GiNaC::expair&gt; &gt; &gt;, GiNaC::expair*) (in /Developer/opt/Ginac/1.5.8/lib/libginac-1.5.0.dylib)<br>


<br>
==51729==    by 0xF7F45E: GiNaC::expair* std::__uninitialized_copy_a&lt;__gnu_cxx::__normal_iterator&lt;GiNaC::expair const*, std::vector&lt;GiNaC::expair, std::allocator&lt;GiNaC::expair&gt; &gt; &gt;, GiNaC::expair*, GiNaC::expair&gt;(__gnu_cxx::__normal_iterator&lt;GiNaC::expair const*, std::vector&lt;GiNaC::expair, std::allocator&lt;GiNaC::expair&gt; &gt; &gt;, __gnu_cxx::__normal_iterator&lt;GiNaC::expair const*, std::vector&lt;GiNaC::expair, std::allocator&lt;GiNaC::expair&gt; &gt; &gt;, GiNaC::expair*, std::allocator&lt;GiNaC::expair&gt;) (in /Developer/opt/Ginac/1.5.8/lib/libginac-1.5.0.dylib)<br>


<br>
==51729==    by 0xF7F518: std::vector&lt;GiNaC::expair, std::allocator&lt;GiNaC::expair&gt; &gt;::vector(std::vector&lt;GiNaC::expair, std::allocator&lt;GiNaC::expair&gt; &gt; const&amp;) (in /Developer/opt/Ginac/1.5.8/lib/libginac-1.5.0.dylib)<br>


<br>
in the same run:<br>
<br>
==51729== Possible data race during read of size 4 at 0x1ea42f4 by thread #3<br>
==51729==    at 0x3AB6: GiNaC::refcounted::add_reference() (in main)<br>
==51729==    by 0xF7C5AB: GiNaC::ptr&lt;GiNaC::basic&gt;::ptr(GiNaC::basic&amp;) (in /Developer/opt/Ginac/1.5.8/lib/libginac-1.5.0.dylib)<br>
==51729==    by 0xF7C5C5: GiNaC::ptr&lt;GiNaC::basic&gt;::ptr(GiNaC::basic&amp;) (in /Developer/opt/Ginac/1.5.8/lib/libginac-1.5.0.dylib)<br>
==51729==    by 0xF7C5ED: GiNaC::ex::ex() (in /Developer/opt/Ginac/1.5.8/lib/libginac-1.5.0.dylib)<br>
==51729==    by 0xF7C604: GiNaC::ex::ex() (in /Developer/opt/Ginac/1.5.8/lib/libginac-1.5.0.dylib)<br>
==51729==    by 0xFCBC50: GiNaC::expairseq::expairseq() (in /Developer/opt/Ginac/1.5.8/lib/libginac-1.5.0.dylib)<br>
==51729==    by 0x10BD804: GiNaC::mul::mul(GiNaC::ex const&amp;, GiNaC::ex const&amp;) (in /Developer/opt/Ginac/1.5.8/lib/libginac-1.5.0.dylib)<br>
==51729==    by 0x10BD88C: GiNaC::mul::mul(GiNaC::ex const&amp;, GiNaC::ex const&amp;) (in /Developer/opt/Ginac/1.5.8/lib/libginac-1.5.0.dylib)<br>
==51729==    by 0x10FF9D0: GiNaC::exminus(GiNaC::ex const&amp;) (in /Developer/opt/Ginac/1.5.8/lib/libginac-1.5.0.dylib)<br>
==51729==    by 0x10FFDD0: GiNaC::operator-(GiNaC::ex const&amp;, GiNaC::ex const&amp;) (in /Developer/opt/Ginac/1.5.8/lib/libginac-1.5.0.dylib)<br>
==51729==    by 0x10BDB0C: GiNaC::mul::derivative(GiNaC::symbol const&amp;) const (in /Developer/opt/Ginac/1.5.8/lib/libginac-1.5.0.dylib)<br>
==51729==    by 0xF965E3: GiNaC::basic::diff(GiNaC::symbol const&amp;, unsigned int) const (in /Developer/opt/Ginac/1.5.8/lib/libginac-1.5.0.dylib)<br>
<br>
<br>
HTH the developers<div><div></div><div class="h5"><br>
<br>
Phil<br>
<br>
_______________________________________________<br>
GiNaC-list mailing list<br>
<a href="mailto:GiNaC-list@ginac.de" target="_blank">GiNaC-list@ginac.de</a><br>
<a href="https://www.cebix.net/mailman/listinfo/ginac-list" target="_blank">https://www.cebix.net/mailman/listinfo/ginac-list</a><br>
</div></div></blockquote></div><br></div>