Numba Python 上出现“Windows 致命异常:访问冲突”错误

问题描述 投票:0回答:1

我正在尝试使用 Numba

parallel
并行化一个简单的
for
循环。令人惊讶的是,我收到一个非常奇怪的错误告诉我这个
"Windows fatal exception: access violation"

知道可能是什么问题吗?

from numba import njit, prange

@njit(parallel =True)
def function(x):
    kk = []
    for i in prange(len(x)):
        kk.append([i, x[i]**10])
    return kk

b = np.random.rand(1000)

%timeit function(b)

这是我收到的整行错误:

Windows fatal exception: code 0xc0000374

Thread 0x00004548Windows fatal exception: code 0xc0000374

 (most recent call first):
  File "C:\Users\Kevin Yew\anaconda3\envs\py10\lib\site-packages\zmq\utils\garbage.py", line 49 in run
  File "C:\Users\Kevin Yew\anaconda3\envs\py10\lib\threading.py", line 1009 in _bootstrap_inner
  File "C:\Users\Kevin Yew\anaconda3\envs\py10\lib\threading.py", line 966 in _bootstrap


Main thread:
Thread 0x00001e38 (most recent call first):
  File "<magic-timeit>", line 1 in inner
  File "C:\Users\Kevin Yew\anaconda3\envs\py10\lib\site-packages\IPython\core\magics\execution.py", line 169 in timeit
  File "C:\Users\Kevin Yew\anaconda3\envs\py10\lib\site-packages\IPython\core\magics\execution.py", line 1180 in timeit
  File "C:\Users\Kevin Yew\anaconda3\envs\py10\lib\site-packages\IPython\core\magic.py", line 187 in <lambda>
  File "C:\Users\Kevin Yew\anaconda3\envs\py10\lib\site-packages\decorator.py", line 232 in fun


Restarting kernel...
python for-loop exception numba
1个回答
0
投票

这是由于不同的线程尝试同时写入同一列表条目。文档通过这个例子警告了这一点:

from numba import njit, prange
import numpy as np

@njit(parallel=True)
def prange_wrong_result(x):
    n = x.shape[0]
    y = np.zeros(4)
    for i in prange(n):
        # accumulating into the same element of `y` from different
        # parallel iterations of the loop results in a race condition
        y[:] += x[i]

    return y

您可以像这样修改代码以避免竞争条件:

import numpy as np
from numba import njit, prange

@njit(parallel =True)
def function(x):
    kk = np.empty((len(x), 2), np.float64)
    for i in prange(len(x)):
        kk[i] = np.array([i, x[i]**10])
    return kk

b = np.random.rand(1000)

%timeit function(b)
© www.soinside.com 2019 - 2024. All rights reserved.