Python cython错误无法分配给外部并行块的私有

Python cython错误无法分配给外部并行块的私有,python,parallel-processing,openmp,cython,python-multithreading,Python,Parallel Processing,Openmp,Cython,Python Multithreading,我试图在SO和Cython用户论坛上找到这个错误的解决方案,但没有找到答案。当我测试文档中提供的完全相同的并行性示例时,我得到了下面附带的错误。我错过了什么?应该如何实施?感谢您的帮助。提前谢谢 下面是cython文档中的代码 来自cython.parallel导入parallel,prange 从libc.stdlib cimport中止,malloc,免费 cdef Py_ssize_t idx,i,n=100 cdef int*本地 cdef大小\u t大小=10 使用nogil,para

我试图在SO和Cython用户论坛上找到这个错误的解决方案,但没有找到答案。当我测试文档中提供的完全相同的并行性示例时,我得到了下面附带的错误。我错过了什么?应该如何实施?感谢您的帮助。提前谢谢

下面是cython文档中的代码
来自cython.parallel导入parallel,prange
从libc.stdlib cimport中止,malloc,免费
cdef Py_ssize_t idx,i,n=100
cdef int*本地
cdef大小\u t大小=10
使用nogil,parallel():
本地_buf=malloc(sizeof(int)*大小)
如果local_buf==NULL:
中止
#在顺序循环中填充本地缓冲区
对于X范围内的i(尺寸):
局部_buf[i]=i*2
#使用线程本地缓冲区共享工作
对于我在prange(n,schedule='guided'):
func(本地业务)
免费(本地)
#我只是简单地添加了这个来测试它
cdef无效函数(int*local_buf)编号:
cdef int i=0
返回
这里是错误
“”
正在编译线程_local.pyx,因为它已更改。
[1/1]Cythonizing线程\u local.pyx
编译Cython文件时出错:
------------------------------------------------------------
#在顺序循环中填充本地缓冲区
对于X范围内的i(尺寸):
局部_buf[i]=i*2
#使用线程本地缓冲区共享工作
对于我在prange(n,schedule='guided'):
^
------------------------------------------------------------
线程_local.pyx:19:10:无法分配给外部并行块的private
回溯(最近一次呼叫最后一次):
文件“setup.py”,第28行,在
ext_modules=cythonize(扩展),)
cythonize中的文件“/apps/anaconda/lib/python2.7/site-packages/Cython/Build/Dependencies.py”,第877行
cythonize_one(*args)
cythonize_one中的文件“/apps/anaconda/lib/python2.7/site-packages/Cython/Build/Dependencies.py”,第997行
raise编译器错误(无,pyx_文件)
Cython.Compiler.Errors.CompileError:thread\u local.pyx

多亏了戴维德,他的猜测是正确的。我不太清楚为什么,但对于使用nogil,parallel():块的
中的两个循环,您似乎无法将相同的变量(在本例中为
I
)重用。我猜作者的意图是为
for
循环使用单独的变量,因为我看到另一个变量被定义为
idx
,但没有使用。我希望他们纠正这个误导性的例子

from cython.parallel import parallel, prange
from libc.stdlib cimport abort, malloc, free

cdef Py_ssize_t idx, i, n = 100
cdef int * local_buf
cdef size_t size = 10

with nogil, parallel():
    local_buf = <int *> malloc(sizeof(int) * size)
    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 idx in prange(n, schedule='guided'):
        func(local_buf)

    free(local_buf)
来自cython.parallel导入parallel,prange
从libc.stdlib cimport中止,malloc,免费
cdef Py_ssize_t idx,i,n=100
cdef int*本地
cdef大小\u t大小=10
使用nogil,parallel():
本地_buf=malloc(sizeof(int)*大小)
如果local_buf==NULL:
中止
#在顺序循环中填充本地缓冲区
对于X范围内的i(尺寸):
局部_buf[i]=i*2
#使用线程本地缓冲区共享工作
对于prange中的idx(n,schedule='guided'):
func(本地业务)
免费(本地)

(未经测试,但)我认为您在重用变量时会感到困惑。尝试为第二个循环使用不同的名称。谢谢David。现在工作很好。
'''
Compiling thread_local.pyx because it changed.
[1/1] Cythonizing thread_local.pyx

Error compiling Cython file:
------------------------------------------------------------
# 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 i in prange(n, schedule='guided'):
     ^
------------------------------------------------------------

thread_local.pyx:19:10: Cannot assign to private of outer parallel block
Traceback (most recent call last):
 File "setup.py", line 28, in <module>
 ext_modules = cythonize(extensions),)
 File "/apps/anaconda/lib/python2.7/site-  packages/Cython/Build/Dependencies.py", line 877, in cythonize
cythonize_one(*args)
File "/apps/anaconda/lib/python2.7/site-     packages/Cython/Build/Dependencies.py", line 997, in cythonize_one
raise CompileError(None, pyx_file)
Cython.Compiler.Errors.CompileError: thread_local.pyx
from cython.parallel import parallel, prange
from libc.stdlib cimport abort, malloc, free

cdef Py_ssize_t idx, i, n = 100
cdef int * local_buf
cdef size_t size = 10

with nogil, parallel():
    local_buf = <int *> malloc(sizeof(int) * size)
    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 idx in prange(n, schedule='guided'):
        func(local_buf)

    free(local_buf)