我有一个函数foo,它将一个指向内存的指针作为参数,并且对该内存进行写入和读取:
cdef void foo (double *data):
data[some_index_int] = some_value_double
do_something_dependent_on (data)
Run Code Online (Sandbox Code Playgroud)
我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)
Run Code Online (Sandbox Code Playgroud)
我现在的问题是:不同的线程如何对待这个?我的猜测是指向的内存data将由所有线程共享,并在函数内部"同时"读取或写入foo.这会弄乱所有结果,因为人们不能依赖先前设定的数据值(内部foo)?我的猜测是正确的还是在cython编译器中实现了一些神奇的安全带?
非常感谢你提前.
python malloc parallel-processing cython python-multithreading
我正在尝试使用Cython来并行化一个昂贵的操作,这涉及生成中间多维数组.
以下非常简化的代码说明了我正在尝试做的事情:
import numpy as np
cimport cython
cimport numpy as np
from cython.parallel cimport prange
from libc.stdlib cimport malloc, free
@cython.boundscheck(False)
@cython.wraparound(False)
def embarrasingly_parallel_example(char[:, :] A):
cdef unsigned int m = A.shape[0]
cdef unsigned int n = A.shape[1]
cdef np.ndarray[np.float64_t, ndim = 2] out = np.empty((m, m), np.float64)
cdef unsigned int ii, jj
cdef double[:, :] tmp
for ii in prange(m, nogil=True):
for jj in range(m):
# allocate a temporary array to hold the result of
# expensive_function_1
tmp_carray …Run Code Online (Sandbox Code Playgroud) python parallel-processing numpy cython thread-local-storage