在编译希望执行精简操作的OpenmP并行代码时,我面临Cython(0.29.13版)的意外行为:
import cython
from cython.parallel import prange,parallel
cpdef omp_test1(n):
cdef int sum = 0,i,imax
imax = <int>n
for i in prange(imax,nogil=True):
sum += 1
return sum
cpdef omp_test2(n):
cdef int sum = 0,imax
imax = <int>n
with nogil,parallel():
for i in prange(imax):
sum += 1
return sum
当调用这两个函数时,我希望输入参数n
作为返回值。而是,返回的值为n * num_threads
。令人惊讶的是,在我的Mac上,只有GCC(v。9.2.0_2)才观察到这种意外行为; clang(v。11.0.0)返回期望值n
。
我做错什么了吗?生成的Cython代码或GCC编译器是否有问题?