小编典典

cython.parallel.prange中的cython共享内存-块

python

我有一个函数foo,该函数将指向内存的指针作为参数,并写入和读取该内存:

cdef void foo (double *data):
   data[some_index_int] = some_value_double
   do_something_dependent_on (data)

我分配data喜欢这样:

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)

我的问题现在是:不同的线程如何处理呢?我的猜测是,指向的内存data将由所有线程共享,并在函数内部“同时”读取或写入foo。然后,由于不能依赖先前设置的datavalue(在内foo),这会弄乱所有结果?我的猜测是正确的还是在cython编译器中实现了一些魔术安全带?

提前非常感谢您。


阅读 215

收藏
2020-12-20

共1个答案

小编典典

我假设没有data线程的读或写同步锁将读/写到内存位置并覆盖彼此的更改。没有某种同步,您将不会获得一致的结果。

尽管文档(http://docs.cython.org/src/userguide/parallelism.html)似乎建议OpenMP(
默认后端 )自动创建线程本地。

2020-12-20