Ben cython.parallel
ile iş parçacığı yerel ndarrays başlatmak için mücadele ediyorum:cython.parallel: iş parçacığı yerel ndarray arabelleği nasıl başlatılır?
Sözde kod:
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...)
Benim sorun olduğunu tüm evrelerde aynı adrese buffer.data
puan. Son olarak buffer
atanan iş parçacığının adresi. buffer
rağmen
parallel()
(ya da alternatif olarak prange
) blok içinde tahsis edilir, Cython bir private
veya iplik yerel değişken buffer
olmak ancak shared
değişken olarak tutar. Sonuç olarak, buffer.data
buffer.data
, aynı bellek bölgesine algoritmamda hasara yol açıyor.
Bu, yalnızca ndarray nesnelerle ilgili bir sorun değildir, ancak görünen tüm cdef class
nesnelerle tanımlanır.
Bu sorunu nasıl çözebilirim?
Eğer gil olmadan 'np.empty' arayabilir miyim? –
belki de [bu yanıt] (http://stackoverflow.com/a/20520295/832621) istediğini getiriyor ... –
@BiRico Bu retorik bir soru mu :)? Hayır, 'nogil' bloğu içinde bir numpy dizisini (veya bir bellek görüntülemesini) tam olarak başlatamazsınız (aksi halde dizi Python'un yönetilen hafızasına tahsis edilmez ve çöp toplanamaz vs.) –