我正在尝试使用 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...
这是由于不同的线程尝试同时写入同一列表条目。文档通过这个例子警告了这一点:
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)