0
%%cython -f -c=-O3 -c=-fopenmp --link-args=-fopenmp
from cython.parallel import parallel, prange
from libc.stdlib cimport abort, malloc, free
cdef int idx, i, n = 100
cdef int k
cdef int * local_buf
cdef int size = 10
cdef void func(int* lb) nogil:
cdef int j
for j in xrange(size):
lb[j] += -1*j
local_buf = <int *> malloc(sizeof(int) * size)
with nogil, parallel():
if local_buf == NULL:
abort()
# populate our local buffer in a sequential loop
for i in xrange(size):
local_buf[i] = i * 2
# share the work using the thread-local buffer(s)
for k in prange(n, schedule='guided'):
func(local_buf)
for i in xrange(size):
print local_buf[i]
free(local_buf)
0
-98
-196
-294
-392
-490
-588
-686
-784
-882
編輯: 上面的塊顯示一次運行後的輸出,但local_buf
中的內容似乎每次都會改變重新運行。這是怎麼回事?這是在Cython這malloc'ed數組?
D'OH我感覺非常愚蠢的。忘記我是在2 forloops,而不是一個。 – richizy
是的,幾乎在每次運行中我都會得到不同的答案。我剛剛得到0 -97 -194 -291 -380 -475 -570 -665 -760 -873 – richizy
@richizy你能嘗試用常規範圍,而不是平行的範圍重新運行它。也許平行化正在搞點東西。 – M4rtini