并行化减慢了 MatLab 中的执行速度

Parallelization slows down execution in MatLab

我在 Mac OS X 运行ning 上使用 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 个值的数组,优化找到最合适的。在这种情况下,循环 运行s 120 次 (b-a = 120),对于图像中水平线上的每个像素一次。

使用 tictoc 对上述代码进行计时,整个循环大约需要 50 秒

我认为并行执行代码可能会加快速度。所以我用 parfor 打开了 3 个工人和 运行 循环,但发现只有边际 (20-30%) 加速。

然后我将工人数量减少到 1。现在 运行使用 parfor 编译代码大约需要 90 秒。因此,对于 1 名工人,代码是应用程序。比 运行ning 没有并行化时慢两倍。这与 3 名工人的小收益一致。

然后我尝试在函数内部计时 FitSignal,发现如果没有并行化,它需要 app. 0.4 秒,而并行化需要 0.7 秒。

我知道并行化会带来开销,但在这种情况下对我来说似乎太过分了。此外,一旦在函数 FitSignal 中,并且只有一个工作人员时,函数 运行 是在主进程中还是在工作人员中应该无关紧要 - 对吧?但是,运行在单独的 worker 中,函数 运行 相当慢!

谁能告诉我哪里出了问题?重要的是,如何更改代码以利用任何可能的并行执行加速?

提前致谢

PS: 我检查了我的系统。内存压力低,我什至在终端中发出 "purge" 来释放内存。 CPU在运行期间不超过15%。

当运行在单台机器上运行时,Matlab 自动并行化矢量运算 (1)... except when you are running explicit parallelisation, like parfor (2)。

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

当你 运行 在 parfor 模式下,你失去了矢量运算的提升,但从 parfor 获得了并行化,所以速度是正常处理的一半,但分成三个核心,所以大约需要三分之二时间.

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