matlab中的嵌套循环矢量化与逐点乘法
长期读者,第一次调查者。因此,我目前遇到了以下代码的严重瓶颈:matlab中的嵌套循环矢量化与逐点乘法,matlab,Matlab,长期读者,第一次调查者。因此,我目前遇到了以下代码的严重瓶颈: 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”执行逐点乘法。问
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或更大
我猜想,接下来发生的事情是,由于缓存限制或数据正在被分页,我的处理器会停止运行。我有理由相信,没有切实可行的方法来减少数组的大小,因此在这一点上,我试图将计算开销降至最低
如果这是不可能的,那么可能是时候考虑使用适当的编程语言了,在这种语言中,我可以强制执行按引用传递,以避免不必要的阵列复制。通常比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:
您使用的是本地工人还是分布式工人?对于本地工作人员,我假设此代码使用普通For运行得更快,因为您使用的大多数函数可能都是使用多个核心实现的。如果你没有足够的内存,矢量化是没有帮助的。嗨,丹尼尔,答案是本地的。那么,你是说,我试图通过将所有的东西都分配到多个核来变得聪明,这实际上妨碍了matlab完成它的工作?你能做一个运行求和,并且只对被乘以的矩阵的分量进行索引吗?如果矩阵中没有唯一的数据,为什么要使用存储冗余信息的内存,对吗?这看起来像是卷积的表亲。您是否考虑过尝试使用fft来实现这一部分?谢谢你,路易斯。有一个函数是这样工作的,这真是令人毛骨悚然,但哦,好吧,这就是Matlab。你是说bsxfun吗?是的,几个月前我发现它时,它给我留下了深刻的印象
umodes = bsxfun(@times, psi, umodes);