【发布时间】:2021-12-09 22:30:02
【问题描述】:
我正在为一个在 WINDOWS 上使用 jit 编译的函数运行一个 python 脚本(下面描述的问题只出现在 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(在不同的 PC 上)具有用户安装和虚拟环境以及相同版本的 numba 和 numpy 无论哪种方式都会导致相同的退出代码,而不会出现错误/回溯。
我还尝试了什么:
- 在调试/非调试模式下运行也没有区别。
- 以管理员身份从 powershell 和 cmd 运行脚本,但它崩溃(在到达代码中的相同位置后)没有显示任何错误/退出代码。
以前的帖子: 我发现了一些具有相同退出代码的帖子,但没有一个与 numba 相关。到目前为止,我一无所知。有人有什么建议吗?
【问题讨论】:
-
这可能是分段错误。
''''some numpy array math (like np.sum) are called here"部分中最重要的部分未共享,因此很难进一步帮助您。越界时经常会出现这样的问题。然而,代码似乎与 Numpy 一起工作的事实很奇怪。尽管如此,我们仍然需要一个可重现示例(尤其是如果它是 Numba 的错误)。 -
@JérômeRichard 好的。由于在不使用 numba 时代码运行良好,因此我假设故障不在循环内。但我又试了一次。根据您的建议,尽量减少。我相应地扩展了我的帖子。它似乎取决于每个矩阵具有的条目数。直到 132600 个条目(矩阵形状 260*510)代码才有效,但如果我使用 261*510(133110 个条目),我会再次得到相同的退出代码......
-