并行化会降低MatLab中的执行速度

时间:2015-11-10 22:40:56

标签: multithreading matlab parallel-processing

我在运行Pentium处理器的Mac OS X上使用Matlab,有4个真核。

我想分析磁共振图像(MRI)并使用优化来拟合来自这些图像的信号。对于每个像素,我有35个值(即在不同条件下获得35次相同的图像),我想将这些值拟合到某个函数

下面,我将代码剥离到调用拟合函数的基本循环:

 ticid1 = tic; 

 for x= a:1:b   
 [a, b, c, d] = FitSignal(Volume(y,x,:)); 
 end;

 toc(ticid1);

此处Volume是一个3D矩阵,可容纳大约9 MB的所有MRI图像。 FitSignal因此得到一个数组,其中包含特定像素的35个值,并且优化找到最佳拟合。在这种情况下,循环运行120次(b-a = 120),对于图像中水平线上的每个像素都是一次。

使用tictoc计算上述代码,整个循环大约需要50秒

我认为并行执行代码可以提高速度。所以我打开了3名工作人员并使用parfor运行循环,但发现只有边际(20-30%)加速。

然后我将工作人员数量减少到1.现在使用parfor运行代码大约需要90秒。所以对于1名工人,代码就是app。比没有并行化运行时慢两倍。这与3名工人的小额福利一致。

然后我尝试在函数FitSignal内进行计时,发现没有并行化就需要app。并行化0.4秒,需要0.7秒。

我知道并行化带来了开销,但在这种情况下,它对我来说似乎过分了。此外,一旦进入函数FitSignal,并且当只有一个工作者时,函数是在主进程上运行还是在工作者中运行 - 对吗?但是,在一个单独的工作者内部运行,该功能运行得相当慢!

谁能告诉我有什么问题?而且重要的是,如何更改代码以利用并行执行的任何可能的加速?

提前致谢

PS:我检查了我的系统。内存压力很低,我甚至在终端发出“清除”以释放内存。运行期间CPU不超过15%。

1 个答案:

答案 0 :(得分:4)

在单台机器上运行时,Matlab会自动并行化向量操作(1)...除非您正在运行显式并行化,例如parfor(2)。

所以,这里发生的事情是,当你在正常模式而不是parfor模式下运行时,你可以根据你的数字从并行向量操作中获得100%的加速。

当你在parfor模式下运行时,你会失去矢量运算增强,但是从parfor获得并行化,这是正常处理速度的一半,但是分成三个核心,所以占用了大约三分之二的时间。

以上是基于问题中数字的粗略估计;当然,对于其他问题,这些相对加速会因许多因素而有所不同,例如不同数量的矢量化代码和parfor的开销。