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)
难道调用collision
时fw
没有更新?
我不太确定你在这里想做什么,但在 tstep 循环中,fw 应该通过碰撞来改变,但它从来没有真正被使用过,直到它被 wbrzeg 再次改变(不管那是什么) .因此,在您的代码中,fw 是否通过碰撞更新实际上并不重要...
这可能只是您示例中某个地方的打字错误,但修复它可能会帮助真正了解您的问题的人(即不是我)...
在 jitted 函数中,rho
在 Numba 编译函数时被视为常量。这与始终考虑更新的 rho
.
的非 jitted 函数不同
请参阅 Numba 常见问题解答中的 this entry。
我正在使用 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)
难道调用collision
时fw
没有更新?
我不太确定你在这里想做什么,但在 tstep 循环中,fw 应该通过碰撞来改变,但它从来没有真正被使用过,直到它被 wbrzeg 再次改变(不管那是什么) .因此,在您的代码中,fw 是否通过碰撞更新实际上并不重要...
这可能只是您示例中某个地方的打字错误,但修复它可能会帮助真正了解您的问题的人(即不是我)...
在 jitted 函数中,rho
在 Numba 编译函数时被视为常量。这与始终考虑更新的 rho
.
请参阅 Numba 常见问题解答中的 this entry。