并行算法的加速使用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
循环不支持的语法:金宝appparfor (i = initVal:步骤:endVal) parfor i = initVal:一步:endVal
你必须使用一个编译器,它支持开放的多处理(OpenMP)应金宝app用程序接口。看到金宝app支持编译器。如果你使用一个不支持OpenMP的编译器,金宝appMATLAB编码器将
parfor
循环,为
循环。在生成的墨西哥人或C / c++代码函数,循环迭代运行在单独的线程中。OpenMP与墨西哥人JIT编译应用程序接口不兼容。看到JIT编译不支持OpenMP金宝app。
循环索引的类型必须由一个整数表示的类型在目标硬件。使用一个类型,不需要多字输入生成的代码。
parfor
独立的代码生成需要的工具链方法构建可执行文件或库。不改变设置导致代码生成器使用makefile的模板方法。看到项目或配置是使用模板Makefile。不要使用以下结构的身体吗
parfor
循环: