长期读者,第一次审问。所以我目前正在从以下代码中遇到严重的瓶颈:
for kk=1:KT
parfor jj=1:KT
umodes(kk,jj,:,:,:) = repmat(squeeze(psi(kk,jj,:,:)), [1,1,no_bands]).*squeeze(umodes(kk,jj,:,:,:));
end
end
用简单的语言,我需要将多维数组'psi'平铺在另一个长度为'no_bands'的维度上,然后用矩阵'umodes'进行逐点乘法。问题是我正在使用的每个阵列都很大,大约20 GB或更多。
我怀疑,正在发生的事情是我的处理器因缓存限制或数据被分页而停止运行。我有理由相信没有减少数组大小的实用方法,所以在这一点上我试图将计算开销减少到最低限度。
如果不可能,可能是时候考虑使用正确的编程语言,我可以通过引用强制执行传递,以避免不必要的数组复制。
答案 0 :(得分:0)
通常bsxfun
使用的内存少于repmat
。所以你可以尝试:
for kk=1:KT
parfor jj=1:KT
umodes(kk,jj,:,:,:) = bsxfun(@times, squeeze(psi(kk,jj,:,:)), squeeze(umodes(kk,jj,:,:,:)));
end
end
或者你可以对两个循环进行矢量化。矢量化通常更快,虽然不一定更具内存效率,所以我不确定它对你的情况有帮助。无论如何,bsxfun
benefits from multihreading:
umodes = bsxfun(@times, psi, umodes);