并行for-Loops (parfor)算法加速
生成代码中的并行for循环(parfor)
为了潜在地加速执行,您可以从MATLAB中生成MEX函数或C/ c++代码®包含并行for循环的代码(parfor
循环)。
一个parfor
-循环,就像标准的MATLAB为
-loop,在一个值范围内执行一系列语句(循环体)。不像为
的迭代parfor
-loop可以在目标硬件上的多个核上并行运行。
并行地运行迭代可以显著地提高生成代码的执行速度。有关更多信息,请参见parfor-Loops如何提高执行速度.
请注意
并行执行只发生在生成的MEX函数或C/ c++代码中;而不是原始的MATLAB代码。为了加速你的MATLAB代码,生成一个MEX函数parfor
循环。然后,从代码中调用MEX函数。有关更多信息,请参见MATLAB算法加速工作流程.
MATLAB编码器™软件使用开放多处理(OpenMP)应用程序接口来支持共享内存,多核代码生成。金宝app如果需要分布式并行,请使用并行计算工具箱™产品。默认情况下,MATLAB编码器尽可能多地使用可用的内核。如果指定要使用的线程数,MATLAB编码器即使有额外的内核可用,也最多为线程使用这个数量的内核。有关更多信息,请参见parfor
.
因为循环体可以在多个线程上并行执行,所以它必须符合某些限制。如果MATLAB编码器软件检测不符合的循环parfor
说明,就会产生错误。有关更多信息,请参见parfor限制.
parfor-Loops如何提高执行速度
一个parfor
-loop可以提供比类似方法更好的执行速度为
-loop,因为多个线程可以在同一个循环上并发计算。
每执行一个主体parfor
-loop被称为迭代。线程以任意顺序计算迭代,并且彼此独立。因为每个迭代都是独立的,所以它们不需要同步。如果线程数等于循环迭代的次数,则每个线程执行一次循环迭代。如果迭代比线程多,则有些线程执行多个循环迭代。
例如,当一个100次迭代的循环在20个线程上运行时,每个线程同时执行循环的5次迭代。如果由于大量迭代或单个迭代很长而导致循环运行时间很长,那么可以使用多线程显著减少运行时间。然而,在本例中,由于并行化的开销,例如线程的创建和删除,您可能无法获得20倍的速度提高。
何时使用parfor-Loops
使用parfor
当你有:
多次迭代的简单计算。
parfor
将循环迭代分成组,以便每个线程执行一组迭代。需要很长时间执行的循环迭代。
parfor
在不同的线程上同时执行迭代。尽管这种同步执行不会减少花费在单个迭代上的时间,但它可能会显著减少花费在循环上的总体时间。
何时不使用parfor-Loops
不要使用parfor
当:
循环的迭代依赖于其他迭代。并行运行迭代会导致错误的结果。
帮助你避免使用
parfor
当循环的一个迭代依赖于其他迭代时,MATLAB编码器指定变量的严格分类。有关更多信息,请参见parfor-Loops中的变量分类.如果MATLAB编码器方法检测不符合parfor
说明,它不生成代码并产生错误。约简是循环迭代必须独立的规则的一个例外。一个减少变量累积一个值,该值依赖于所有的迭代,但与迭代顺序无关。有关更多信息,请参见减少变量.
只有少数迭代执行一些简单的计算。
请注意
对于少量的循环迭代,由于并行化的开销,您可能不会加速执行。这些开销包括线程创建、线程之间的数据同步和线程删除所花费的时间。
parfor-Loop语法
对于一个
parfor
-loop,使用以下语法:(i = InitVal:EndVal)
要指定最大线程数,请使用以下语法:
parfor (i = InitVal:EndVal,NumThreads)
有关更多信息,请参见parfor
.
parfor限制
的
parfor
循环不支持以下语法:金宝appparfor (i=initVal:step:endVal) parfor i=initVal:step:endVal
您必须使用支持Open Multiprocessing (金宝appOpenMP)应用程序接口的编译器。看到金宝app支持编译器.如果您使用的编译器不支持OpenMP,金宝appMATLAB编码器将
parfor
循环,为
循环。在生成的MEX函数或C/ c++代码中,循环迭代在单个线程上运行。OpenMP应用程序接口与JIT MEX编译不兼容。看到JIT编译不支持OpenMP金宝app.
循环索引的类型必须在目标硬件上用整数类型表示。在生成的代码中使用不需要多字类型的类型。
parfor
对于独立的代码生成,需要使用工具链方法来构建可执行程序或库。不要更改导致代码生成器使用模板makefile方法的设置。看到项目或配置正在使用模板Makefile.对象的主体中不使用下列构造
parfor
循环: