文档

加快循环利用parfor生成实现代码

当你为一个模型生成C / c++代码通过使用MATLAB函数,一个MATLAB系统,为每一个子系统,默认情况下,代码生成器生成的代码实现在一个线程循环。这循环可以优化MATLAB函数MATLAB系统块。的迭代parfor循环可以在多核并行运行在目标硬件。

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

代码生成器实现的并行循环利用OpenMP。

嵌入式编码器™软件使用开放多处理(OpenMP)应用程序接口来支持共享内存,多核代码生成。金宝app默认情况下,嵌入式编码器使用尽可能多的线程可用。如果你指定要使用线程的数量,嵌入式编码器使用最多数量的线程,即使额外的线程可用。有关更多信息,请参见parfor

parfor-Loops提高执行速度如何

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

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

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

何时使用parfor-Loops

使用parfor当你有:

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

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

当不使用parfor-Loops

不要使用parfor当:

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

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

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

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

    请注意

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

通过使用parfor-Loops编写代码

for循环并行运行生成的代码,编写代码中MATLAB函数,或者一个MATLAB系统,块使用parfor

  1. 创建一个模型™模型金宝app。

  2. 添加MATLAB函数或者是MATLAB系统块模型。

  3. 添加的代码MATLAB函数或者是MATLAB系统块。

    函数y = access3a (u)% # codegen% 2010年版权MathWorks公司。持续的pA;如果isempty (pA) pA = 0;结束A = 1 (20、50);t = 0;parfor(i = 1:10, 4)(我,1)=(我,1)+ 1;结束y = (1、4) + u + t + pA;

  4. 优化窗格中选择最大限度地提高执行速度选择从优先级(金宝app仿真软件编码器)下拉列表。的参数生成平行for循环(金宝app仿真软件编码器)是自动选择的。使编译器的参数来计算并行循环。

  5. 连接块。

  6. 建立模型并生成代码。

    在生成的代码,编译指示指示编译器执行的循环OpenMP通过多线程并行for循环:

    # pragma omp num_threads平行(4 > omp_get_max_threads () ?omp_get_max_threads (): 4)

    数量4表明处理线程的数量。

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

相关的话题