主要内容

parfor

平行循环

描述

例子

parforLoopVarInitValEndVal语句;结束在生成的MEX函数或在共享内存多核平台上并行运行的C/ c++代码中创建循环。

parfor循环执行语句的值LoopVar之间的InitValEndvalLoopVar指定一个整数值递增1的向量。

例子

parfor (LoopVarInitValEndValNumThreads);语句;结束使用最大的NumThreads创建并行时的线程循环。

例子

全部折叠

生成一个MEX函数parfor-loop在最大可用核数上执行。

写一个MATLAB®函数,test_parfor,它调用快速傅里叶变换函数,fft,在一个parfor循环。由于循环迭代是并行运行的,因此该计算可以比类似计算更快地完成循环。

函数一个= test_parfor% # codegen一个= 1 (10256);r =兰德(10256);parforI = 1:10 a(I,:) = real(fft(r(I)));结束结束

为生成一个MEX函数test_parfor.在MATLAB命令行中,输入:

codegentest_parfor

codegen生成一个MEX函数,test_parfor_mex,在当前文件夹中。

运行MEX函数。在MATLAB命令行中,输入:

test_parfor_mex

MEX函数使用可用的内核运行。

类生成MEX函数时指定最大线程数parfor循环。

编写MATLAB函数,specify_num_threads,它使用输入,u中指定的最大线程数parfor循环。

函数y = specify_num_threads (u)% # codegeny = 1 (1100);% u指定最大线程数parfor(i = 1:100,u) y(i) = i结束结束

为生成一个MEX函数specify_num_threads.使用args 0指定输入的类型。在MATLAB命令行中,输入:

% -args 0指定输入u是一个标量双精度代码生成器将% u类型转换为整数codegen报告specify_num_threadsarg游戏0

codegen生成一个MEX函数,specify_num_threads_mex,在当前文件夹中。

运行MEX函数,指定它最多在四个线程上并行运行。在MATLAB命令行中,输入:

specify_num_threads_mex (4)

生成的MEX函数最多可以在四个核上运行。如果可用核数少于4个,则MEX函数在调用时的最大可用核数上运行。

类的MEX函数生成之前禁用并行化parfor循环。

编写MATLAB函数,test_parfor,它调用快速傅里叶变换函数,fft,在一个parfor循环。

函数一个= test_parfor% # codegen一个= 1 (10256);r =兰德(10256);parforI = 1:10 a(I,:) = real(fft(r(I)));结束结束

为生成一个MEX函数test_parfor.禁用OpenMP,以便codegen不会生成可以在多个线程上运行的MEX函数。

codegen- o禁用:OpenMPtest_parfor

codegen生成一个MEX函数,test_parfor_mex,在当前文件夹中。

运行MEX函数。

test_parfor_mex

MEX函数在单个线程上运行。

如果你禁用并行化,MATLAB编码器™对待parfor循环,循环。该软件生成一个在单个线程上运行的MEX函数。禁用并行化,以比较生成的MEX函数或C/ c++代码的串行和并行版本的性能。您还可以禁用并行化以调试并行版本的问题。

输入参数

全部折叠

初始值为的循环索引变量InitVal最终值是EndVal

循环索引变量的初始值,Loopvar.与EndVal,指定了parfor范围向量,它必须是M: N

循环索引变量的最终值,LoopVar.与InitVal,指定了parfor范围向量,它必须是M: N

在MATLAB中执行的一系列命令parfor循环。

如果您在同一行上放置了多个语句,请用分号分隔这些语句。例如:

parforI = 1:10 arr(I) = rand();arr (i) = 2 * arr (i) 1;结束

要使用的最大线程数。如果你指定上限,MATLAB编码器使用不超过这个数字,即使有额外的核心可用。如果请求的线程数超过可用内核数,MATLAB编码器使用调用时可用的最大内核数。如果循环迭代少于线程,则有些线程不执行任何工作。

如果parfor-loop不能在多个线程上运行(例如,如果只有一个内核可用或NumThreads是0),MATLAB编码器以串行方式执行循环。

限制

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

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

  • 不使用下面的结构parfor循环:

    • 不能使用。调用外部函数coder.extrinsic在…的身体里parfor循环。

    • 函数中的全局变量不能写入parfor循环。

    • MATLAB编码器不支持的使用金宝appcoder.ceval在减少。例如,您不能生成以下代码parfor循环:

      parfory = code .ceval(“myCFcn”, y,我);结束
      相反,编写一个本地函数来调用C代码coder.ceval调用这个函数parfor循环。例如:
      parfori = 1:4 y = callMyCFcn(y,i);结束函数y = callMyCFcn(y,i) y = code .ceval(“mCyFcn”, i);结束

    • 你不能使用变长度输入宗量varargoutparfor循环。

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

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

有关限制的全面列表,请参见parfor限制

提示

  • 使用一个parfor循环时间:

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

    • 循环迭代需要很长时间来执行。

  • 不要使用parfor当你的循环中的一个迭代依赖于其他迭代的结果时。

    还原是这个规则的一个例外。一个减少变量累积一个值,该值依赖于所有的迭代,但与迭代顺序无关。

  • 输入参数NumThreads集OpenMPnum_threads ()子句。OpenMP还支持通过设金宝app置环境变量来全局限制C/ c++中的线程数OMP_NUM_THREADS或使用omp_set_num_threads ().有关更多信息,请参阅openMP规范。https://www.openmp.org/specifications/

介绍了R2012b