Derniers messages sur Zeste de Savoirhttps://zestedesavoir.com/forums/2016-11-27T01:36:37+01:00Les derniers messages parus sur le forum de Zeste de Savoir.Appeler du code parallèle depuis cython, message #1327892016-11-27T01:36:37+01:00nohar/@noharhttps://zestedesavoir.com/forums/sujet/7410/appeler-du-code-parallele-depuis-cython/?page=1#p132789<p>Ah oui en effet le python au milieu de code natif ça punit assez sévèrement. </p>
<p>En particulier ça t'oblige à réacquérir implicitement le GIL, mais même sans ça : une opération élémentaire en Python est de l'ordre de la micro-seconde, là ou tu mesures tes fonctions en C en nano-secondes.</p>Appeler du code parallèle depuis cython, message #1323662016-11-23T21:28:10+01:00yoch/@yochhttps://zestedesavoir.com/forums/sujet/7410/appeler-du-code-parallele-depuis-cython/?page=1#p132366<p>Re,</p>
<p>J'ai fini par trouver, en fait la partie OpenMP était nickel, c'est une fonction de conversion des données appelée juste avant qui plombait les perfs de manière insensée. J'aurais appris qu'un appel en python pur au milieu d'une boucle cython peut faire très très mal…</p>Appeler du code parallèle depuis cython, message #1323432016-11-23T19:34:06+01:00yoch/@yochhttps://zestedesavoir.com/forums/sujet/7410/appeler-du-code-parallele-depuis-cython/?page=1#p132343<p>Merci pour vos réponses.</p>
<p>Le code OpenMP vient de moi, et il fonctionne parfaitement avec le programme original. En principe, je n'ai pas besoin de définir <code>OMP_NUM_THREADS</code> et j'obtiens automatiquement le nombre de coeurs disponibles sur ma machine, mais c'est peut-être différent avec python, je vais tester.</p>Appeler du code parallèle depuis cython, message #1323092016-11-23T16:59:28+01:00anonyme/@anonymehttps://zestedesavoir.com/forums/sujet/7410/appeler-du-code-parallele-depuis-cython/?page=1#p132309<p>Salut, je ne serais pas d'une grande aide parce que n'ai fait que jouer un peu avec OpenMP en C/Fortran mais les options de compilation de g++ ont l'air bonnes, tu n'as pas oublié le -fopenmp. J'imagine que tu n'oublie pas de fixer ta variable d'environnement OMP_NUM_THREADS ou de préciser NUM_THREADS dans la définition de ta région parallèle.</p>Appeler du code parallèle depuis cython, message #1323012016-11-23T15:54:13+01:00Kje/@Kjehttps://zestedesavoir.com/forums/sujet/7410/appeler-du-code-parallele-depuis-cython/?page=1#p132301<blockquote>
<p>(le GIL bloque également les threads externes ?)</p>
</blockquote>
<p>Non. Le GIL empêche que deux thread de code python s’exécute en parallèle. Si tu met des <code>with nogil</code> CPython va, éventuellement, exécuter un autre thread Python de ton même process (si il y en a) durant l’exécution de ta fonction. Mais il n'a aucune influence sur le reste.</p>
<p>L'erreur vient très certainement de la lib que tu utilise (il faut activer quelque chose au run-time?) ou de la ligne de compilation. Ça va être difficile à dire sans connaitre la lib que tu utilise ou voir son code. Tu as déjà réussi à la faire fonctionner en multi-coeur en dehors de Python ?</p>Appeler du code parallèle depuis cython, message #1322962016-11-23T15:22:19+01:00yoch/@yochhttps://zestedesavoir.com/forums/sujet/7410/appeler-du-code-parallele-depuis-cython/?page=1#p132296<p>Bonjour,</p>
<p>J'essaie d’écrire un wrapper pour utiliser une classe cpp en python, j'ai suivi les instructions <a href="http://cython.readthedocs.io/en/latest/src/userguide/wrapping_CPlusPlus.html">ici</a> et j'arrive a obtenir un module qui fonctionne depuis python. Le souci est que le code d'origine est conçu pour exploiter tous les coeurs disponibles (OpenMP), et que la version python ne le fait visiblement pas.</p>
<p>Les options de compilations me semblent OK. J'ai essayé d'ajouter des <code>with nogil</code> aux endroits critiques (le GIL bloque également les threads externes ?), mais ça ne règle pas le problème. Quelqu'un sait comment faire ?</p>
<p>Le code de mon <code>.pyx</code> ressemble a ceci :</p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="k">cdef</span> <span class="kr">extern</span> <span class="k">from</span> <span class="s">"../som.h"</span> <span class="n">namespace</span> <span class="s">"som"</span><span class="p">:</span>
<span class="k">cdef</span> <span class="kt">cppclass</span> <span class="nf">Som</span><span class="p">:</span>
<span class="n">Som</span><span class="p">(</span><span class="nb">unsigned</span><span class="p">,</span> <span class="nb">unsigned</span><span class="p">,</span> <span class="nb">unsigned</span><span class="p">)</span>
<span class="n">void</span> <span class="n">train</span><span class="p">(</span><span class="n">vector</span><span class="p">[</span><span class="n">sparse_vec</span><span class="p">]</span><span class="o">&</span><span class="p">,</span> <span class="nb">unsigned</span><span class="p">,</span> <span class="nb">float</span><span class="p">,</span> <span class="nb">float</span><span class="p">)</span> <span class="k">nogil</span>
<span class="k">cdef</span> <span class="k">class</span> <span class="nf">_Som</span><span class="p">:</span>
<span class="k">cdef</span> <span class="kt">Som</span> * <span class="nf">c_som</span>
<span class="k">def</span> <span class="nf">__cinit__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">unsigned</span> <span class="n">h</span><span class="p">,</span> <span class="nb">unsigned</span> <span class="n">w</span><span class="p">,</span> <span class="nb">unsigned</span> <span class="n">d</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">c_som</span> <span class="o">=</span> <span class="n">new</span> <span class="n">Som</span><span class="p">(</span><span class="n">h</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">d</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">train</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">vector</span><span class="p">[</span><span class="n">sparse_vec</span><span class="p">]</span><span class="o">&</span> <span class="n">data</span><span class="p">,</span> <span class="nb">unsigned</span> <span class="n">epochs</span><span class="o">=</span><span class="mf">10</span><span class="p">,</span> <span class="nb">float</span> <span class="n">r0</span><span class="o">=</span><span class="mf">0</span><span class="p">,</span> <span class="nb">float</span> <span class="n">rN</span><span class="o">=</span><span class="mf">0.5</span><span class="p">):</span>
<span class="c"># python code</span>
<span class="k">with</span> <span class="k">nogil</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">c_som</span><span class="o">.</span><span class="n">train</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">epochs</span><span class="p">,</span> <span class="n">r0</span><span class="p">,</span> <span class="n">rN</span><span class="p">)</span>
</pre></div>
</td></tr></table>
<p>Et je compile comme ceci :</p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3
4</pre></div></td><td class="code"><div class="codehilite"><pre><span></span>cython --cplus -a _som.pyx
g++ -shared -pthread -fPIC -fwrapv -O2 -Wall -std<span class="o">=</span>c++11 <span class="se">\ </span>
-fno-strict-aliasing -fopenmp -I/usr/include/python3.5 <span class="se">\ </span>
-o _som.so _som.cpp ../som.cpp ../sparse_vec.cpp
</pre></div>
</td></tr></table>
<p>Merci d'avance</p>