2014-02-14 25 views
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數組?

回答

3

結果似乎是合理的給定的代碼,你實際上得到不同的結果每次運行?

這應該是常規的Python相當於:

size = 10 
n = 100 

lst = [i*2 for i in range(size)] 

for i in range(n): 
    for j in range(size): 
     lst[j] += -1*j 
print lst 
#[0, -98, -196, -294, -392, -490, -588, -686, -784, -882] 
+0

D'OH我感覺非常愚蠢的。忘記我是在2 forloops,而不是一個。 – richizy

+0

是的,幾乎在每次運行中我都會得到不同的答案。我剛剛得到0 -97 -194 -291 -380 -475 -570 -665 -760 -873 – richizy

+0

@richizy你能嘗試用常規範圍,而不是平行的範圍重新運行它。也許平行化正在搞點東西。 – M4rtini