我在运行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),对于图像中水平线上的每个像素都是一次。
使用tic
和toc
计算上述代码,整个循环大约需要50秒
我认为并行执行代码可以提高速度。所以我打开了3名工作人员并使用parfor
运行循环,但发现只有边际(20-30%)加速。
然后我将工作人员数量减少到1.现在使用parfor
运行代码大约需要90秒。所以对于1名工人,代码就是app。比没有并行化运行时慢两倍。这与3名工人的小额福利一致。
然后我尝试在函数FitSignal
内进行计时,发现没有并行化就需要app。并行化0.4秒,需要0.7秒。
我知道并行化带来了开销,但在这种情况下,它对我来说似乎过分了。此外,一旦进入函数FitSignal
,并且当只有一个工作者时,函数是在主进程上运行还是在工作者中运行 - 对吗?但是,在一个单独的工作者内部运行,该功能运行得相当慢!
谁能告诉我有什么问题?而且重要的是,如何更改代码以利用并行执行的任何可能的加速?
提前致谢
PS:我检查了我的系统。内存压力很低,我甚至在终端发出“清除”以释放内存。运行期间CPU不超过15%。