Ich kämpfe lokalen Thread-ndarrays mit cython.parallel
zu initialisieren:cython.parallel: Wie thread-local ndarray buffer initialisieren?
Pseudo-Code:
cdef:
ndarray buffer
with nogil, parallel():
buffer = np.empty(...)
for i in prange(n):
with gil:
print "Thread %d: data address: 0x%x" % (threadid(), <uintptr_t>buffer.data)
some_func(buffer.data) # use thread-local buffer
cdef void some_func(char * buffer_ptr) nogil:
(... works on buffer contents...)
Mein Problem ist, dass in allen Threads buffer.data
Punkte an die gleiche Adresse. Nämlich die Adresse des Threads, der zuletzt buffer
zugewiesen wurde.
Trotz buffer
innerhalb des parallel()
(oder alternativ prange
) -Block zugeordnet ist, macht nicht Cython buffer
a private
oder faden lokale Variable, sondern hält es als shared
Variable.
Als Ergebnis buffer.data
verweist auf die gleiche Speicherregion Chaos auf meinem Algorithmus.
Dies ist kein Problem ausschließlich mit NDarray-Objekten, sondern scheinbar mit allen cdef class
definierten Objekten.
Wie löse ich dieses Problem?
Können Sie rufen 'np.empty' ohne gil? –
vielleicht [diese Antwort] (http://stackoverflow.com/a/20520295/832621) bringt, was Sie wollen ... –
@BiRico Ist das eine rhetorische Frage :)? Nein, Sie können definitiv kein numpiges Array (oder eine Speicheransicht) innerhalb eines 'nogil' Blocks instanziieren (andernfalls würde das Array nicht in Pythons verwaltetem Speicher zugewiesen werden und könnte keine Garbage Collected sein usw.) –