performance - MATLAB parfor 比 for 慢——有什么问题吗?

标签 performance matlab parallel-processing parfor

我正在处理的代码有如下循环:

bistar = zeros(numdims,numcases); 
parfor hh=1:nt       
  bistar = bistar +  A(:,:,hh)*data(:,:,hh+1)' ;
end   

对于小 nt (10)。

计时后,它实际上比使用常规循环慢 100 倍!!!我知道 parfor 可以进行并行求和,所以我不确定为什么这不起作用。

我跑

matlabpool

在运行我的代码之前使用开箱即用的配置。

我是 matlab 的新手,刚开始使用并行功能,所以请不要认为我没有做傻事。

谢谢!

PS:我在四核上运行代码,所以我希望看到一些改进。

最佳答案

对于较小的 nt 值,对结果进行分区和分组(划分工作并从多个线程/核心收集结果的开销)很高。这很正常,您不会为可以在简单循环中快速执行的简单任务划分数据。

始终在循环内执行一些值得分区开销的具有挑战性的事情。这是一个不错的 introduction to parallel programming .

线程来自线程池,因此创建线程的开销不应该存在。但是为了创建部分结果 n 必须创建 bistar 大小的矩阵,计算所有部分结果,然后必须添加所有这些部分结果(重新组合) .在一个直接循环中,这很可能就地完成,没有分配发生。

帮助中的完整语句(感谢您在下方提供的链接)是:

If the time to compute f, g, and h is large, parfor will be significantly faster than the corresponding for statement, even if n is relatively small.

所以你看他们的意思和我的意思完全一样,只有当你在循环中做的事情足够复杂/足够耗时时,小 n 值的开销才值得付出努力。

关于performance - MATLAB parfor 比 for 慢——有什么问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3174358/

相关文章:

java - 数据结构 : Which should I use for these conditions?

mysql if inside select with aggregate functions

MATLAB:更改命令窗口的字体大小

c - Matlab 在 C 中生成的 Dll

c# - 问题与 Task.WhenAll 并行调用 Azure 移动客户端

r - R 中的 furrr 包不会继续将工作分散到所有内核?

java - 为什么在 RecyclerView.Adapter 的 onBindViewHolder 中添加 OnClickListener 被认为是不好的做法?

javascript - 文档上的 JQuery 触发事件性能

matlab - 如何用对数刻度绘制 hist

concurrency - 并行和并发编程