主要内容

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

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

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

一个parfor-loop,就像标准的MATLAB-循环,在一系列值上执行一系列语句(循环体)的迭代parfor-loop可以在目标硬件的多个核上并行运行。

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

请注意

并行执行只发生在生成的MEX函数或C/ c++代码中;而不是原始的MATLAB代码。要加速MATLAB代码,可以从parfor-循环。然后,从代码中调用MEX函数。有关详细信息,请参阅MATLAB算法加速工作流程

MATLAB编码器™软件使用openmultiprocessing (OpenMP)应用接口支持共享内存、多核代码生成。金宝app如果您想要分布式并行,请使用并行计算工具箱™产品。默认情况下,MATLAB编码器使用尽可能多的可用内核。如果指定要使用的线程数,MATLAB编码器即使有额外的内核可用,线程也最多使用该数量的内核。有关详细信息,请参阅parfor

因为循环体可以在多个线程上并行执行,所以它必须符合某些限制。如果MATLAB编码器软件检测不符合的循环parfor规范,则会产生错误。有关详细信息,请参阅parfor限制

parfor循环如何提高执行速度

一个parfor-循环可能提供比类似循环更好的执行速度-loop,因为多个线程可以在同一个循环上并发计算。

函数体的每次执行parfor-loop称为迭代。线程以任意顺序计算迭代,并且彼此独立。因为每个迭代都是独立的,所以它们不必同步。如果线程的数量等于循环迭代的次数,则每个线程执行一次循环迭代。如果迭代多于线程,则有些线程执行不止一次循环迭代。

例如,当一个包含100次迭代的循环在20个线程上运行时,每个线程同时执行该循环的5次迭代。如果您的循环由于大量迭代或单个迭代很长而需要很长时间运行,那么您可以使用多个线程显著减少运行时间。然而,在本例中,由于并行化开销(例如线程创建和删除),您可能无法获得20倍的速度提升。

何时使用parfor循环

使用parfor如果您有:

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

  • 执行循环迭代需要很长时间。parfor在不同线程上同时执行迭代。虽然这种同时执行不会减少单个迭代所花费的时间,但可能会显著减少循环所花费的总时间。

何时不使用parfor-Loops

不要使用parfor什么时候:

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

    帮助您避免使用parfor当循环的一个迭代依赖于其他迭代时,MATLAB编码器指定变量的严格分类。有关详细信息,请参阅parfor循环中变量的分类.如果MATLAB编码器检测不符合的循环parfor规范,它不会生成代码并产生错误。

    减少是循环迭代必须独立的规则的一个例外。A.减少变量累积一个值,该值取决于所有迭代,但与迭代顺序无关。有关详细信息,请参阅还原变量

  • 只有几个迭代执行一些简单的计算。

    请注意

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

parfor-Loop语法

  • 对于一个parfor-loop,使用下面的语法:

    parfor i = InitVal:EndVal

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

    parfor (i = InitVal:EndVal,NumThreads)

有关更多信息,请参见parfor

parfor限制

  • parfor循环不支持以下语法:金宝app

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

  • 必须使用支持开放式多处理(OpenMP)应用程序接口的编译金宝app器。看见金宝app支持编译器. 如果您使用的编译器不支持OpenMP,金宝appMATLAB编码器parfor循环,-循环。在生成的MEX函数或C/C++代码中,循环迭代在单个线程上运行。

  • OpenMP应用程序接口与JIT MEX编译不兼容。看见JIT编译不支持OpenMP金宝app

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

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

  • 不要在主体中使用以下构造parfor循环:

    • 嵌套parfor循环

    • Break和return语句

    • 全局变量

    • 减少MATLAB

    • 减少烧焦变量

    • 使用外部C代码进行约简

    • 非本征函数调用

    • 内联函数

    • 展开循环

    • 变长度输入宗量/瓦拉戈特