gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 17:26:40 25 4
gpt4 key购买 nike

我试图在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com