Ho difficoltà a inizializzare ndarrays thread-locale con cython.parallel
:cython.parallel: come inizializzare il buffer ndarray locale del thread?
pseudo-codice:
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...)
Il mio problema è che in tutte le discussioni buffer.data
punti allo stesso indirizzo. Vale a dire l'indirizzo del thread che ha assegnato l'ultima volta buffer
.
Nonostante buffer
essendo assegnato all'interno del blocco parallel()
(o in alternativa prange
), Cython non fa buffer
una variabile private
o thread locale ma mantiene come variabile shared
.
Come risultato, buffer.data
punta alla stessa area di memoria che provoca il caos sul mio algoritmo.
Questo non è un problema esclusivamente con oggetti ndarray ma apparentemente con tutti gli oggetti definiti cdef class
.
Come posso risolvere questo problema?
può chiamare 'np.empty' senza la gil? –
forse [questa risposta] (http://stackoverflow.com/a/20520295/832621) porta quello che vuoi ... –
@BiRico E 'una domanda retorica :)? No, non è possibile istanziare una matrice numpy (o una memoryview) all'interno di un blocco 'nogil' (altrimenti la matrice non verrebbe allocata nella memoria gestita da Python, e non potrebbe essere raccolta dei dati inutili, ecc.) –