进程已完成,退出代码为 -1073741819 (0xC0000005) numba.jit
Process finished with exit code -1073741819 (0xC0000005) with numba.jit
我正在运行宁一个python脚本使用jit编译一个函数有3个嵌套for循环WINDOWS(下面描述的问题只出现在WINDOWS,而不是在 LINUX 上 运行!)。
最小工作示例:
import numpy as np
from numba import jit
@jit(nopython=True)
def compute_loop(a, b, c):
for i in range(a.shape[0]):
for j in range(a.shape[1]):
S0 = b[i, j]
for k in range(1, 5):
print('Entered last loop')
if b[i + k, j + k] / S0 < 0.05:
c[i, j] = np.sum(S0 * b[i:i + k, j:j + k])
break
if k == 4:
c[i, j] = np.sum(S0 * b[i:i + k, j:j + k])
print('End')
return c
def main():
size_i = 261
size_j = 510
print(size_i*size_j)
a = np.random.rand(size_i, size_j)
b = np.random.rand(size_i, size_j)
c = np.zeros((size_i, size_j))
compute_loop(a, b, c)
if __name__ == '__main__':
main()
当我 运行 使用 size_i>260
时,脚本会以退出代码中断
Process finished with exit code -1073741819 (0xC0000005)
没有任何进一步的错误消息或回溯。退出发生在退出最后一个 for 循环之前,这意味着它将多次打印 'Entered last for loop' 但最终只是在没有警告的情况下产生退出代码,并且从未到达 return 语句(或者就此而言打印命令 'End').
代码 运行 在 size_i<=260
时或者当我在没有 jit 的情况下使用函数时或者当我在 LINUX!
上 运行 时它很好
所以这似乎取决于输入矩阵的矩阵大小,这是否有效。仍然不明白如何修复它...
Python 我试过的版本:
- 3.7.5 在系统范围内安装,但在具有 numba 0.54.1 和 numpy 1.20.3 的虚拟环境中。
- 3.7.7(在另一台电脑上)具有用户安装和虚拟环境以及相同版本的 numba 和 numpy
两种方式都导致相同的退出代码,没有 error/traceback.
我还尝试了什么:
- 运行 在 debug/not 调试模式下也没有区别。
- 运行 来自 powershell 和 cmd 的脚本作为管理员,但它崩溃了(到达代码中的相同位置后),没有显示任何 error/exit 代码。
以前的帖子:
我发现了一些具有相同退出代码的帖子,但其中 none 与 numba 有关。到目前为止,我一无所知。如果有人有什么建议?
b[i + k, j + k]
上有一个 越界 。这在没有 Numba 的情况下是可见的。确实,Numpy(版本 1.20.3)明确报告错误:
IndexError: index 510 is out of bounds for axis 1 with size 510
Numba 假定索引有效,不会报告此类错误,如果它们无效则可能会崩溃(因为检查索引的成本很高)。请注意,您可以使用 assertions 自己检查索引(使用 assert
)。
我正在运行宁一个python脚本使用jit编译一个函数有3个嵌套for循环WINDOWS(下面描述的问题只出现在WINDOWS,而不是在 LINUX 上 运行!)。 最小工作示例:
import numpy as np
from numba import jit
@jit(nopython=True)
def compute_loop(a, b, c):
for i in range(a.shape[0]):
for j in range(a.shape[1]):
S0 = b[i, j]
for k in range(1, 5):
print('Entered last loop')
if b[i + k, j + k] / S0 < 0.05:
c[i, j] = np.sum(S0 * b[i:i + k, j:j + k])
break
if k == 4:
c[i, j] = np.sum(S0 * b[i:i + k, j:j + k])
print('End')
return c
def main():
size_i = 261
size_j = 510
print(size_i*size_j)
a = np.random.rand(size_i, size_j)
b = np.random.rand(size_i, size_j)
c = np.zeros((size_i, size_j))
compute_loop(a, b, c)
if __name__ == '__main__':
main()
当我 运行 使用 size_i>260
时,脚本会以退出代码中断
Process finished with exit code -1073741819 (0xC0000005)
没有任何进一步的错误消息或回溯。退出发生在退出最后一个 for 循环之前,这意味着它将多次打印 'Entered last for loop' 但最终只是在没有警告的情况下产生退出代码,并且从未到达 return 语句(或者就此而言打印命令 'End').
代码 运行 在 size_i<=260
时或者当我在没有 jit 的情况下使用函数时或者当我在 LINUX!
所以这似乎取决于输入矩阵的矩阵大小,这是否有效。仍然不明白如何修复它...
Python 我试过的版本:
- 3.7.5 在系统范围内安装,但在具有 numba 0.54.1 和 numpy 1.20.3 的虚拟环境中。
- 3.7.7(在另一台电脑上)具有用户安装和虚拟环境以及相同版本的 numba 和 numpy 两种方式都导致相同的退出代码,没有 error/traceback.
我还尝试了什么:
- 运行 在 debug/not 调试模式下也没有区别。
- 运行 来自 powershell 和 cmd 的脚本作为管理员,但它崩溃了(到达代码中的相同位置后),没有显示任何 error/exit 代码。
以前的帖子: 我发现了一些具有相同退出代码的帖子,但其中 none 与 numba 有关。到目前为止,我一无所知。如果有人有什么建议?
b[i + k, j + k]
上有一个 越界 。这在没有 Numba 的情况下是可见的。确实,Numpy(版本 1.20.3)明确报告错误:
IndexError: index 510 is out of bounds for axis 1 with size 510
Numba 假定索引有效,不会报告此类错误,如果它们无效则可能会崩溃(因为检查索引的成本很高)。请注意,您可以使用 assertions 自己检查索引(使用 assert
)。