Matlab工人怎么工作?

3视图(30天)
托拜厄斯Brambier
托拜厄斯Brambier 2022年5月10日
评论道: Edric埃利斯 2022年5月23日
所以我一直在努力优化/ parallelising现有的代码作为项目的一部分,在我的研究。这样做的时候,我遇到了一个非常奇怪的问题,至少给我。
“问题”时我让代码运行在一个正常的循环,而parfor-loop。根据parfor-loop tic-toc命令的运行时使用一个职工大约一半的运行时,它将使用一个标准的for循环。
我的问题是,根据我的理解独立的Matlab是单线程的。但也使用一个线程使用一个职工仍然是更快,甚至更快。这正是我对形势的理解让我困惑。
是的,我有检查,实际上只有一个工人使用单个线程。
最重要的是我需要一个解释,我为这个项目最终的论文。
我真的希望找到任何解释或甚至一个提示,对我来说,奇怪的行为。
4评论
沃尔特·罗伯森
沃尔特·罗伯森 2022年5月11日
//www.tatmou.com/help/matlab/ref/maxnumcompthreads.html

登录置评。

答案(1)

托拜厄斯Brambier
托拜厄斯Brambier 2022年5月19日
编辑:托拜厄斯Brambier 2022年5月19日
好了,之后我发现以前实现waitbar创建了一些巨大的开销是一个简化版本的代码仍然引起同样的困惑:
%这通常只是用于生成外部提供输入数据
%这个数字(深圳)是一个增加改变的工作量!
深圳= 120;
我= 1:深圳
j = 1:深圳
x ((i - 1) *深圳+ j:) = (j - 1, - 1);
结束
结束
j = 1: sz - 1
我= 1:深圳
公司= (j - 1) *深圳+ i;
:康涅狄格州(inc) =(公司,公司+深圳);
结束
结束
j = 1:深圳
i = 1: sz - 1
公司= (j - 1) *深圳+ i;
康涅狄格州(+ 1,:)=(公司,公司+ 1);
结束
结束
numnp =大小(x, 1);
的ndm =大小(x, 2);
ndf = ndm;
numelem =大小(康涅狄格州,1);
k_parallel =稀疏(numnp * ndf, numnp * ndf);
%这是重要组成部分
parpool (1)
抽搐
parfore = 1: numelem
k_elem_gs =稀疏(numnp * ndf, numnp * ndf);
I =康涅狄格州(e, 1);
J =康涅狄格州(e, 2);
t = x (J:)——(我:);
L =规范(t);
t = t / L;
B = (- t, t) / L;
k_elem = B * B * L;
i = 1:2
我=康涅狄格州(e,我);
j = 1:2
J =康涅狄格州(e, J);
k_elem_gs (ndf *(张)+ 1:我* ndf, ndf * (J - 1) + 1: J * ndf) =
k_elem_gs (ndf *(张)+ 1:我* ndf, ndf * (J - 1) + 1: J * ndf)
+ k_elem (ndf *(张)+ 1:我* ndf, ndf * (j - 1) + 1: j * ndf);
结束
结束
k_parallel = k_parallel + k_elem_gs;
结束
toc
1评论
Edric埃利斯
Edric埃利斯 2022年5月23日
我没有一个明确的答案,但这就是我 认为 是怎么回事。串行MATLAB分析器显示,昂贵的计算的增量 k_elem_gs 的更新 k_parallel 。特别是,我 认为 的更新 k_parallel 得到 更多的 非零元素数量的增加。这是重要的,因为一个 parfor 这些添加循环重新排列。即使当使用一个工人, parfor 的工作循环分为“子范围”,分别执行。这些附属的区域将开始增加 k_parallel 从头开始,即从“廉价”添加。因此而客户端 这是循环:
k = k + k + k + k + k + k + k;
的一名员工 parfor 更喜欢这个:
k = {k + k + k} + {k + k} + {k + k};
(每 k 右边当然是不同的)。仍然有相同数量的增加,但并不是所有的昂贵的增加。

登录置评。

类别

找到更多的在并行for循环(parfor)帮助中心文件交换

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!