主要内容

使用并行for循环的算法加速(parfor)

生成代码中的并行for循环(parfor)

为了潜在地加速执行,您可以从MATLAB生成MEX函数或C/ c++代码®包含并行for循环的代码(帕弗循环)。

A.帕弗-循环,就像标准的MATLAB对于-loop,在一个值范围内执行一系列语句(循环体)。不像对于-然而,循环的迭代帕弗-环路可以在目标硬件上的多个核上并行运行。

并行地运行迭代可能会显著提高生成代码的执行速度。有关更多信息,请参见parfor循环如何提高执行速度.

笔记

并行执行只发生在生成的MEX函数或C/C++代码中;不是原始的MATLAB代码。要加速MATLAB代码,请从帕弗循环。然后,从代码中调用MEX函数。有关更多信息,请参见加速MATLAB算法的工作流.

MATLAB编码器™软件使用开放式多处理(OpenMP)应用程序接口来支持共享内存、多核代码生成。如果您想要分布式并行,请使用并行计算工具箱™ 产品默认情况下,万博1manbetxMATLAB编码器尽可能多地使用可用的内核。如果指定要使用的线程数,MATLAB编码器即使有额外的内核可用,线程也最多使用这个数量的内核。有关更多信息,请参见帕弗.

因为循环体可以在多个线程上并行执行,所以它必须遵守某些限制。如果MATLAB编码器软件检测不符合以下条件的循环:帕弗说明,它产生一个错误。有关更多信息,请参见parfor限制.

parfor循环如何提高执行速度

A.帕弗-loop可能提供比它的类似函数更好的执行速度对于-循环,因为多个线程可以在同一个循环上并发计算。

每一次执行一个帕弗-循环称为迭代。线程以任意顺序并相互独立地评估迭代。因为每个迭代都是独立的,所以它们不必同步。如果线程数等于循环迭代次数,则每个线程执行一次循环迭代。如果迭代次数多于线程,则某些线程会执行多个循环迭代。

例如,当一个100次迭代的循环在20个线程上运行时,每个线程同时执行该循环的5次迭代。如果由于大量迭代或单个迭代过长,循环运行时间较长,则可以使用多个线程显著减少运行时间。然而,在本例中,由于并行化的开销,例如线程的创建和删除,您的速度可能不会提高20倍。

何时使用parfor-Loops

使用帕弗当你有:

  • 简单计算的多次迭代。帕弗将循环迭代划分为多个组,以便每个线程执行一组迭代。

  • 需要很长时间执行的循环迭代。帕弗在不同的线程上同时执行迭代。尽管这种同步执行不会减少在单个迭代上花费的时间,但它可能会显著减少在循环上花费的总体时间。

何时不使用parfor循环

不要使用帕弗当:

  • 循环的迭代依赖于其他迭代。并行地运行迭代可能会导致错误的结果。

    以帮助您避免使用帕弗当循环的某个迭代依赖于其他迭代时,MATLAB编码器指定变量的严格分类。有关更多信息,请参见parfor循环中变量的分类. 如果MATLAB编码器检测不符合要求的循环帕弗说明,它不生成代码并产生错误。

    缩减是循环迭代必须独立的规则的一个例外。A.还原变量累积一个值,该值依赖于所有的迭代,但与迭代顺序无关。有关更多信息,请参见减少变量.

  • 只有少数迭代执行一些简单的计算。

    笔记

    对于少量循环迭代,由于并行化开销,您可能无法加速执行。这些开销包括线程创建、线程之间的数据同步和线程删除所花费的时间。

parfor循环语法

  • 暂时帕弗-循环,使用以下语法:

    parfor i=InitVal:EndVal parfor(i=InitVal:EndVal)

  • 要指定最大线程数,请使用以下语法:

    parfor(i=InitVal:EndVal,NumThreads)

有关更多信息,请参见帕弗.

parfor限制

  • 这个帕弗Loop不支持以下语法:万博1manbetx

    parfor(i=initVal:step:endVal)parfor i=initVal:step:endVal

  • 您必须使用支持开放多处理(OpenMP)应用程序接口的编译万博1manbetx器。看到万博1manbetx支持的编译器. 如果You use a compiler that does not support OpenMP,MATLAB编码器对待帕弗-循环作为对于循环。在生成的MEX函数或C/ c++代码中,循环迭代在单个线程上运行。

  • OpenMP应用程序接口与JIT MEX编译不兼容。看到JIT编译不支持OpenMP万博1manbetx.

  • 循环索引的类型必须可由目标硬件上的整数类型表示。在生成的代码中使用不需要多字类型的类型。

  • 帕弗对于独立代码生成,需要使用工具链方法来构建可执行文件或库。不要更改导致代码生成器使用模板生成文件方法的设置。看到项目或配置正在使用模板生成文件.

  • 对象的主体中不要使用下列结构帕弗循环:

    • 嵌套parfor-loops

    • Break和return语句

    • 全局变量

    • 降低MATLAB班级

    • 降低字符变量

    • 减少使用外部C代码

    • 外部函数调用

    • 内联函数

    • 展开循环

    • 瓦拉金/varargout