python - cython错误无法分配给外部并行 block 的私有(private)

标签 python parallel-processing openmp cython python-multithreading

我试图在 SO 和 Cython 用户论坛上找到此错误的解决方案,但找不到答案。当我测试文档 Cython 0.23.1 documentation 中提供的完全相同的并行性示例时,然后我收到下面附加的错误。我缺少什么?应该如何实现?任何帮助表示赞赏。提前致谢

这是 cython 文档中的代码

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 i in prange(n, schedule='guided'):
    func(local_buf)

free(local_buf)

# I just simply added this to test it
cdef void func(int* local_buf) nogil:
cdef int i=0
return

这是错误

'''
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

最佳答案

感谢 DavidW,他的猜测是正确的。我不太清楚为什么,但似乎您不能在 with nogil, parallel(): block 内的两个 for 循环中重用相同的变量(在本例中为 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)

关于python - cython错误无法分配给外部并行 block 的私有(private),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32470538/

相关文章:

Python:从字符串中删除一个字符

python - 为什么我的命令在 Sage 笔记本上没有改变颜色?那么如何编译在Sage笔记本上编写的程序呢?

c++ - 如何剖析 OpenMP 瓶颈

c - 并非所有数组元素都发送

由 小码哥发布于 2019-03-18 标签:c++openmpshared_ptrdatarace

c++ - std::lock_guard 在 openmp 并行

python - 将字符串拆分为相同字母的 block

python - 二元实体关系的三元关系

c++ - 原子访问 C++11 和 OpenMP 中的非原子内存位置?

c - OpenMP:如何指定任务执行的频率