2
這是我正在嘗試做的一個最簡單的例子。我正在計算矩陣之間的成對距離,我將它們排列成一個堆棧數組。 idx
數組保存每個子矩陣的偏移量。與Cython記憶體並行
當我刪除parallel()
並將prange
替換爲range
時,代碼按預期工作(當然,不是平行的)。
import numpy as np
cimport numpy as np
cimport cython
from cython.parallel import parallel, prange
@cython.boundscheck(False)
@cython.wraparound(False)
@cython.nonecheck(False)
def all_pairs_distance(float[:,::1] stacked, int[::1] idx):
cdef int n = idx.shape[0] - 1
cdef float[:,::1] D = np.zeros((n,n), dtype='float32')
cdef int i,j
cdef float[:,::1] t1,t2
cdef float d
with nogil, parallel():
for i in prange(n):
t1 = stacked[idx[i]:idx[i+1],:]
for j in range(i+1, n):
t2 = stacked[idx[j]:idx[j+1],:]
d = nogil_cython_function(t1, t2)
D[i,j] = d
D[j,i] = d
return D
cdef float nogil_cython_function(float[:,::1] a, float[:,::1] b) nogil:
# Function abbreviated for simplicity
return 0.0
當試圖編譯該文件,我得到的每一個分配錯誤t1
或t2
:
Memoryview slices can only be shared in parallel sections
- 我不知道如何解決這個錯誤。這些任務是否不在平行部分?
- 如何告訴編譯器我的
stacked
memoryview是隻讀的,並且可以在線程之間共享嗎?
我想你可以給每個線程只有他們實際使用的數組部分。檢查[這個答案](http://stackoverflow.com/a/20520295/832621)這是用原始指針(我發現這個任務更直接)實現這 –