- yoch,
Bonjour,
J'essaie d’écrire un wrapper pour utiliser une classe cpp en python, j'ai suivi les instructions ici 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.
Les options de compilations me semblent OK. J'ai essayé d'ajouter des with nogil
aux endroits critiques (le GIL bloque également les threads externes ?), mais ça ne règle pas le problème. Quelqu'un sait comment faire ?
Le code de mon .pyx
ressemble a ceci :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | cdef extern from "../som.h" namespace "som": cdef cppclass Som: Som(unsigned, unsigned, unsigned) void train(vector[sparse_vec]&, unsigned, float, float) nogil cdef class _Som: cdef Som * c_som def __cinit__(self, unsigned h, unsigned w, unsigned d): self.c_som = new Som(h, w, d) def train(self, vector[sparse_vec]& data, unsigned epochs=10, float r0=0, float rN=0.5): # python code with nogil: self.c_som.train(data, epochs, r0, rN) |
Et je compile comme ceci :
1 2 3 4 | cython --cplus -a _som.pyx g++ -shared -pthread -fPIC -fwrapv -O2 -Wall -std=c++11 \ -fno-strict-aliasing -fopenmp -I/usr/include/python3.5 \ -o _som.so _som.cpp ../som.cpp ../sparse_vec.cpp |
Merci d'avance
+0
-0