【发布时间】:2018-10-21 19:26:47
【问题描述】:
我正在尝试对大型数组执行数值积分,并且计算需要很长时间。我尝试使用 numba 和 jit 装饰器来加速我的代码,但不支持 numpy.trapz。
我的新想法是创建 n 个线程来并行运行计算,但我想知道如何才能做到这一点,或者它是否可行?
引用下面的代码
我可以让 sz[2] 多个线程同时运行,调用 ZO_SteadState 来计算值吗?
for i in range(sz[1]):
phii = phi[i]
for j in range(sz[2]):
s = tau[0, i, j, :].reshape(1, n4)
[R3, PHI3, S3] = meshgrid(rprime, phiprime, s)
BCoeff = Bessel0(bm * R3)
SS[0, i, j] = ZO_SteadyState(alpha, b,bm,BCoeff,Bessel_Denom, k2,maxt,phii, PHI2, PHI3, phiprime,R3,rprime,s,S3, T,v)
有问题的计算。
@jit()
def ZO_SteadyState(alpha, b,bm,BCoeff,Bessel_Denom, k2,maxt,phii, PHI2, PHI3, phiprime,R3,rprime,s,S3, T,v):
g = 1000000 * exp(-(10 ** 5) * (R3 - (b / maxt) * S3) ** 2) * (
exp(-(10 ** 5) * (PHI3 - 0) ** 2) + exp(-(10 ** 5) * (PHI3 - 2 * np.pi) ** 2) + exp(
-(10 ** 5) * (PHI3 - 2 * np.pi / 3) ** 2) + exp(
-(10 ** 5) * (PHI3 - 4 * np.pi / 3) ** 2)) # stationary point heat source.
y = R3 * ((np.sqrt(2) / b) * (1 / (np.sqrt((H2 ** 2 / bm ** 2) + (1 - (v ** 2 / (bm ** 2 * b ** 2))))))
* (BCoeff / Bessel_Denom)) * np.cos(v * (phii - PHI3)) * g
x = (np.trapz(y, phiprime, axis=0)).reshape(1, 31, 300)
# integral transform of heat source. integral over y-axis
gbarbar = np.trapz(x, rprime, axis=1)
PHI2 = np.meshgrid(phiprime, s)[0]
sz2 = PHI2.shape
f = h2 * 37 * Array_Ones((sz2[0], sz[1])) # boundary condition.
fbar = np.trapz(np.cos(v * (phii - PHI2)) * f, phiprime, 1).reshape(1, n4) # integrate over y
A = (alpha / k) * gbarbar + ((np.sqrt(2) * alpha) / k2) * (
1 / (np.sqrt((H2 ** 2 / bm ** 2) + (1 - (v ** 2 / (bm ** 2 * b ** 2)))))) * fbar
return np.trapz(exp(-alpha * bm ** 2 * (T[0, i, j] - s)) * A, s)
【问题讨论】:
-
是的,您可以使用
multiprocessing.Pool轻松地进行多重处理。你会想要子进程,而不是线程。 -
@CJ59 我认为这里的线程非常好,因为几乎所有的计算都是在
numpy库中完成的,它允许多个线程并行运行。线程意味着更少的数据混洗,因此线程实际上可能更快。 -
也许吧,但是如果您从 numpy 的 openmp 部分获得最大优势,那么线程将无济于事。如果你不是,那么线程将无济于事(但子处理会)。
-
@CJ59 为什么在使用线程时无法获得 OpenMP 的优势?据我所知,将它们组合起来应该没有内在问题。
标签: python multithreading optimization multiprocessing numba