讲解视频:可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。
MATLAB教程新手入门篇(数学建模清风主讲,适合零基础同学观看)_哔哩哔哩_bilibili
在MATLAB中,'parfor'(Parallel for)是一种并行编程工具,它允许在多个处理核心上同时执行循环迭代。这种方法与常规的for循环类似,但能够在多个工作进程上并行执行循环迭代,从而加快代码运行速度。这对于需要进行重复计算或处理大型数据集的任务尤为有效。请在MATLAB官方网站上搜索关于'parfor'的相关信息,并尝试将之前代码中的for循环替换为parfor循环。测试代码是否能够正常运行,并比较for循环和parfor循环的执行时间。
参考:
(1)https://ww2.mathworks.cn/help/parallel-computing/parfor.html
(2)https://ww2.mathworks.cn/help/coder/ug/acceleration-of-matlab-algorithms-using-parallel-for-loops-parfor.html
以下内容节选自MATLAB官网:
parfor 循环如何提高执行速度
parfor 循环可提供高于其同类 for 循环的执行速度,因为多个线程可以对同一循环以并发方式执行计算。
parfor 循环体的每次执行称为一次迭代。这些线程以任意顺序执行迭代计算,且彼此独立。由于每次迭代都是独立的,因此它们不必同步。如果线程数等于循环迭代次数,则每个线程将执行一次循环迭代。如果迭代次数超过线程数,则某些线程将执行多次循环迭代。
例如,当包含 100 次迭代的循环在 20 个线程上运行时,每个线程将同时执行五次循环迭代。如果循环因包含大量迭代或单个迭代过长而需要很长时间才能运行完毕,您可以使用多个线程来显著减少运行时间。不过,在此示例中,速度提升可能达不到 20 倍,因为存在并行化开销(如线程创建和删除)。
何时使用 parfor 循环
在下列情况下,请使用 parfor:
- 多次简单计算迭代。parfor 会将这些循环迭代分为若干组,以使每个线程执行一组迭代。
- 一次循环迭代需要很长时间才能执行完毕。parfor 可在不同线程上同时执行迭代。虽然这种同时执行不会减少单个迭代所花费的时间,但它可以大大减少整个循环所花费的总时间。
何时不使用 parfor 循环
在下列情况下,请不要使用 parfor:
- 循环的某次迭代依赖于其他迭代。并行运行迭代可能导致错误的结果。为了避免在循环的某次迭代依赖于其他迭代时使用 parfor,MATLAB Coder 指定了变量的刚性分类。有关详细信息,请参阅 Classification of Variables in parfor-Loops。如果 MATLAB Coder 检测到循环不符合 parfor 设定,将不会生成代码并且会产生错误。规则要求循环迭代必须是独立的,但归约是一个例外。归约变量会将依赖于所有迭代的值累加在一起,但与迭代顺序无关。有关详细信息,请参阅Reduction Variables。
- 只有几次执行一些简单计算的迭代。注意 对于少量循环迭代,由于存在并行化开销,可能并不能提升执行速度。此类开销包括线程创建、线程之间的数据同步以及线程删除所花费的时间。
有关详细信息,请参阅 parfor。parfor 限制
- parfor 循环不支持以下语法:
- parfor (i=initVal:step:endVal)
- parfor i=initVal:step:endVal
- 不要在 parfor 循环体中使用以下构造:
- 嵌套 parfor 循环
- break 和 return 语句
- 全局变量
- 对 MATLAB 类使用归约
- 对 char 变量使用归约
- 使用外部 C 代码的归约
- 外部函数调用
- 内联函数
- 展开循环
- varargin/varargout
事实上大家要记住一点,parfor循环中的数据需要具有独立性:每次循环迭代必须是独立的,即每次迭代的结果不应该依赖于其他迭代的结果。
因此对于蒙特卡罗模拟的例子,是比较适合使用parfor循环的。
下面我们来看对比:
一只失明的小猫掉进山洞里,山洞有三个门,其中一个门进去后走2h后可以回到地面,第二个门进去后走4h又回到原始出发点,第三个门进去后走6h还是回到原始出发点。猫是随机选择的,求小猫走出山洞的期望时间?
(1)传统的循环语句
(2)并行循环(注意,首次使用parfor时可能会启动并行工具箱,这会耽误一定时间)