我正在尝试在数组H_n = Sum(Amp * B1 * B_{n-1})
的并行处理中对等式W
进行编码。
For i=0 Bn = Bn ** w, else Bn = B_{n-1} * B1 .
然后乘以Amp并求和,为H
中的每个w
生成W
。
如何应用并行处理来加快速度?我无法弄清楚并行处理如何知道先前的索引Bn是否尚未计算,当并行处理将W拆分为块以应用该函数时。
对于每个核心正在处理的新Bn
块的W
,该块的第一个Bn
值可以通过以下方式计算:
Bn[i] = Bn[0] * (B1**(i-1))
例如,如果W
被分成8个CPU内核的8个数组,则可以使用上面的等式计算8个数组中每个数组的第一个Bn
值。然后通过H_w
计算sum(B_{i-1} * B1)
会更快。
仅供参考:
exp(-j * w[ i ] * t ) = exp(-j * delta_w * t) * exp(-j * w[i-1])
B的长度为48474705
K=2**16
k=np.arange(1,K)
Fs=40e3
delta_w=2*np.pi*Fs/K
W=k*delta_w
Amp=[Amplitude(l,m,n,u) for u in U for l in L for m in M for n in N
if dist(l,m,n,u) < 1500]
B=[np.exp(-1j*dist(l,m,n,u)/room.speed_of_sound) for u in U for l
in L for m in M for n in N if dist(l,m,n,u) < 1500]
B1=[np.exp(-1j*delta_w*dist(l,m,n,u)/room.speed_of_sound) for u in
U for l in L for m in M for n in N if dist(l,m,n,u) < 1500]
Bn=np.array(B)
i=0
for w in W:
if i=0:
Bn=Bn**w
Hw[i]=np.einsum('i,i->',Amp,Bn)
i=i+1
else:
Bn=np.array(Bn*B1)
Hw[i]=np.einsum('i,i->',Amp,Bn)
i=i+1
return(Hw)