Numba'fied 函数在 for 循环中的计算结果与纯 Python 不同

Numba'fied function evaluates differently in for loop then pure Python one

我正在使用 numba 来加速函数,包括许多 for 循环。比他们在外部 for 循环中调用。

在循环中调用时,其中一个函数的计算结果与 not jited 不同。

函数:

def collison(u, v, f, feq, omega, w, cx, cy, n, m):
    for i in range(0, n):
        for j in range(0, n):
            t1 = u[i,j]*u[i,j] + v[i,j]*v[i,j]
            for k in range(9):
                t2 = u[i,j]*cx[k] + v[i,j]*cy[k]
                feq[k,i,j] = rho[i,j]*w[k]*(1. + 3.*t2 + 4.5*t2**2 - 1.5*t1)
                f[k,i,j] = omega*feq[k, i, j] + (1. - omega)*f[k, i, j]
    return f

u, v - ndarray n x m f, feq - ndarray 9 x n x m

我只是在声明前添加装饰器:@nb.jit(nopython=True)

循环:

for tstep in range(mstep):
    fk = collison(u, v, fw, feq, omega, w, cx, cy, n, m)
    fs = stream(fk, n, m)
    fw = wbrzeg(fs, n, m, u0)
    rho, u, v = rhouv(fw, rho, u, v, cx, cy, n, m)

难道调用collisionfw没有更新?

我不太确定你在这里想做什么,但在 tstep 循环中,fw 应该通过碰撞来改变,但它从来没有真正被使用过,直到它被 wbrzeg 再次改变(不管那是什么) .因此,在您的代码中,fw 是否通过碰撞更新实际上并不重要...

这可能只是您示例中某个地方的打字错误,但修复它可能会帮助真正了解您的问题的人(即不是我)...

在 jitted 函数中,rho 在 Numba 编译函数时被视为常量。这与始终考虑更新的 rho.

的非 jitted 函数不同

请参阅 Numba 常见问题解答中的 this entry