Performance 如何使用parfor在MATLAB中对超大数据集进行优化加法、乘法和平均

Performance 如何使用parfor在MATLAB中对超大数据集进行优化加法、乘法和平均,performance,algorithm,matlab,bigdata,parfor,Performance,Algorithm,Matlab,Bigdata,Parfor,我想介绍一下我在研究中遇到的一个有趣的MATLAB编程问题。该解决方案可能适用于在非常大的数据集上进行计算的人。它涉及使用parfor在RAM和CPU使用之间取得平衡。因为我的数据太大,所以必须反复读取文件才能进行处理。它介绍的另一个问题是找到一个优化算法,用于对非常大的向量和矩阵进行乘法、求和和和平均 我已经找到了一个解决方案,但这需要时间,我也想看看社区是否有改进的余地。这是问题的一般形式 假设我们有大约30000个函数,我们对它们进行了傅里叶变换。每个变换的形式为ek=ak+bk*i,其中

我想介绍一下我在研究中遇到的一个有趣的MATLAB编程问题。该解决方案可能适用于在非常大的数据集上进行计算的人。它涉及使用parfor在RAM和CPU使用之间取得平衡。因为我的数据太大,所以必须反复读取文件才能进行处理。它介绍的另一个问题是找到一个优化算法,用于对非常大的向量和矩阵进行乘法、求和和和平均

我已经找到了一个解决方案,但这需要时间,我也想看看社区是否有改进的余地。这是问题的一般形式

假设我们有大约30000个函数,我们对它们进行了傅里叶变换。每个变换的形式为ek=ak+bk*i,其中k是波向量的幅值,a是实分量,b是虚分量。这些转换中的每一个都以2列表格的形式保存到文件中,其结构如下所示。每个向量中的元素数约为N=1e6。这意味着这些文件的大小都是1/64 GB。请注意,k_i的值不一定按顺序排列

k | Ree Ime

k|U 1 | a1 b1

k|U 2 | a2 b2

|

昆安bN

目标是将每对模式交叉相乘,并在大约50个固定的k波段上对结果进行平均。例如,如果我们让向量5和7的元素分别表示为e5=a5+b5*i和e7=a7+b7*i,我们需要

a51*a71+b51*b71

a52*a72+b52*b72

a5N*a7N+b5N*b7N

上述N维向量的每个元素都属于一个k-bin。每个存储箱中的所有元素都必须求平均值并返回。所以在单模式比较的最后,我们只得到了50个数字

我有一台配备512GB内存和48个处理器的计算机。我的Matlab2013a版本限制我只能在运行的每个MATLAB实例上同时打开12个带有parfor的处理器。所以我一直在做的就是打开4个版本的MATLAB,每个版本分配10个处理器,向每个处理器发送最大数量的数据,而不会超出我自己设定的450 GB的限制

当然,这涉及到我把问题分成几个部分。如果我有30000个向量e,那么我将有30000^2组这50个交叉系数。因为问题是对称的,所以它实际上是这个的一半。我决定把我的问题分成m=300的块。这意味着我将有100行和100列这些块。我正在运行的代码看起来像这样,我简化了一些,只包括相关的位:

对于ii,每个块行的比例为1:100% [a,b]=f_ReadModesii;%如果ii=1,此功能读取模式1至300, %如果ii=2,则模式301至600,依此类推 %“a”和“b”是大小为Nx300的矩阵 %“a”包含存储在列中的实向量, %“b”包含存储在列中的虚拟向量 对于jj=ii:上三角形中的每个块列为100% [c,d]=f_ReadModesjj;%与上述内容相同,不同之处在于其内容不同 %一套300种模式 块=零300300,50;%为结果分配空间。第一 %尺寸对应于ii模式。 %第二个维度对应于“jj” %模式。第三个尺寸适用于每个k-bin。 parfor rr=1:300 A=零1300,50;%临时储存,以保持帕尔默的快乐 ModeMult=bsxfun@times,a:,rr,c+bsxfun@times,b:,rr,d; %我的策略是将一种模式与之前所有的模式交叉相乘 %继续。所以当rr=6时,我乘以a和b中的第六个模式 %通过c和d中的所有模式。这将有助于填充第6行 %区块的,即区块6,:,:。 对于kk=1:50%,现在我将每个k-bin中的结果取平均值 ind_dk=f_kbinskk;%这将返回a、b、c、d和 %位于kk^th bin中的ModeMult A1,:,kk=平均模式多路数dk,:;%每个箱子的平均结果 终止 blockrr,:,:=A;%将结果放在更永久的存储中。 终止 f_writeBlock;%将生成的交叉系数块写入磁盘 终止 终止 这个问题有三个瓶颈:

1及时阅读

2计算ac和bd的乘积,然后求和,这是ModeMult

3在每个k-bin中平均步骤2的结果

更大的块更好,因为它们需要更少的读入 . 但是,步骤2和步骤3中的计算不会自动并行,因此必须使用parfor将它们发送到各个处理器。因为计算成本很高,所以使用所有处理器似乎是必要的


按照我编写代码的方式,每个处理器都需要足够的内存来容纳4*N*m个元素。当m=300时,这意味着每个处理器使用大约10GB的RAM。如果每个处理器的内存需求能够以某种方式降低,那就太好了。如果第2步和第3步中的计算能够被重写以更高效地运行,那也将非常好。有什么想法吗?

对于步骤1,除非您的数据在单独的光盘上,否则在尝试从4个不同的matlab会话并行读取数据时,您可能不会节省那么多时间,甚至可能在某些情况下,它们都会相互干扰并减慢整个过程。我建议您按顺序测试读取大量块,然后在4个会话中读取相同数量的块。计算两个操作的时间并进行比较。