Mam funkcji foo
, która przyjmuje wskaźnik do pamięci jako argument i obu zapisuje i odczytuje do tej pamięci:Cython pamięci współdzielonej w cython.parallel.prange - blok
cdef void foo (double *data):
data[some_index_int] = some_value_double
do_something_dependent_on (data)
ja przyznając data
jak więc:
cdef int N = some_int
cdef double *data = <double*> malloc (N * sizeof (double))
cdef int i
for i in cython.parallel.prange (N, nogil=True):
foo (data)
readout (data)
Moje pytanie brzmi teraz: jak traktują to różne wątki? Domyślam się, że pamięć wskazywana przez data
będzie współdzielona przez wszystkie wątki i "jednocześnie" odczytywana lub zapisywana podczas działania funkcji foo
. To zepsułoby wszystkie wyniki, ponieważ nie można polegać na wcześniej ustawionej wartości danych (w ramach foo
)? Czy moje przypuszczenia są słuszne, czy też jakiś magiczny pas bezpieczeństwa został zaimplementowany w kompilatorze cythonowym?
Dziękuję bardzo z góry.
** Uwaga: ** Nie mam OpenMP na żadnym z moich systemów, więc nie mogę tego przetestować z łatwością. –