主要内容

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

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

可能加速执行,您可以生成墨西哥人从MATLAB函数或C / c++代码®代码包含并行for循环(parfor循环)。

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

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

请注意

生成的并行执行只发生在墨西哥人函数或C / c++代码;不是原始的MATLAB代码。加速你的MATLAB代码,生成一个墨西哥人的功能parfor循环。墨西哥人的函数调用之后,从你的代码。有关更多信息,请参见工作流加速MATLAB算法

使用parfor在MATLAB代码中,您需要一个并行计算工具箱™许可证。

MATLAB编码器™软件使用开放多处理(OpenMP)应用程序接口来支持共享内存,多核代码生成。金宝app如果你想分布式并行性,利用并行计算工具箱的产品。默认情况下,MATLAB编码器使用尽可能多的核心发现可用。如果你指定要使用线程的数量,MATLAB编码器使用最多的内核线程数,即使额外的核心是可用的。有关更多信息,请参见parfor

因为循环体可以并行执行多个线程,它必须符合一定的限制。如果MATLAB编码器软件检测到循环不符合parfor规范,它产生一个错误。有关更多信息,请参见parfor限制

parfor-Loops提高执行速度如何

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

身体的每个执行的parfor循环迭代。线程评估迭代以任意顺序和彼此独立的。因为每次迭代都是独立的,他们不需要同步。如果线程的数量等于循环迭代的数量,每个线程执行的一个迭代循环。如果有更多的迭代比线程,线程执行多个循环迭代。

例如,当100年一个循环迭代20日运行线程,每个线程同时执行五个循环迭代。如果你的循环需要很长时间来运行,因为大量的冗长的迭代或者个人迭代,可以显著降低运行时使用多个线程。然而,在本例中,您可能不会得到提高20倍的速度因为并行开销,比如线程创建和删除。

何时使用parfor-Loops

使用parfor当你有:

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

  • 一个循环迭代,需要很长时间来执行。parfor在不同的线程同时执行迭代。尽管这个同步执行不减少单个迭代所花费的时间,可能会大大降低总体时间循环。

当不使用parfor-Loops

不要使用parfor当:

  • 迭代的循环取决于其他迭代。并行运行的迭代会导致错误的结果。

    帮助你避免使用parfor当你的迭代循环取决于其他迭代,MATLAB编码器指定严格的分类变量。有关更多信息,请参见在parfor-Loops分类变量。如果MATLAB编码器不符合检测循环parfor规范,它不生成代码并产生一个错误。

    削减是一个例外,循环迭代必须独立。一个减少变量积累的值取决于一起迭代,但独立于迭代顺序。有关更多信息,请参见减少变量

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

    请注意

    对于小数量的循环迭代,您可能不会加速执行并行开销。这些费用包括线程创建时间,线程之间的数据同步,和线程删除。

parfor-Loop语法

  • 对于一个parfor循环,使用这种语法:

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

  • 指定线程的最大数量,使用这种语法:

    parfor (i = InitVal: EndVal NumThreads)

有关更多信息,请参见parfor

parfor限制

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

    parfor (i = initVal:步骤:endVal) parfor i = initVal:一步:endVal

  • 你必须使用一个编译器,它支持开放的多处理(OpenMP)应金宝app用程序接口。看到金宝app支持编译器。如果你使用一个不支持OpenMP的编译器,金宝appMATLAB编码器parfor循环,循环。在生成的墨西哥人或C / c++代码函数,循环迭代运行在单独的线程中。

  • OpenMP与墨西哥人JIT编译应用程序接口不兼容。看到JIT编译不支持OpenMP金宝app

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

  • parfor独立的代码生成需要的工具链方法构建可执行文件或库。不改变设置导致代码生成器使用makefile的模板方法。看到项目或配置是使用模板Makefile

  • 不要使用以下结构的身体吗parfor循环:

    • 嵌套parfor-loops

    • 打破并返回语句

    • 全局变量

    • 降低MATLAB

    • 降低字符变量

    • 减少使用外部C代码

    • 非本征函数调用

    • 内联函数

    • 展开循环

    • 变长度输入宗量/varargout