进程已完成,退出代码为 -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 我试过的版本:

我还尝试了什么:

以前的帖子: 我发现了一些具有相同退出代码的帖子,但其中 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)。