主要内容

议案

平行对于-循环

描述

议案Loopvar.=initval.endval.;陈述;结束在生成的MEX函数中或在共享内存多核平台上并行运行的C / C ++代码中创建一个循环。

议案-loop执行陈述对于价值观Loopvar.之间initval.endval.Loopvar.指定增加1的整数值的向量。

Parcol(Loopvar.=initval.endval.numthreads.);陈述;结束最多使用numthreads.创建并行时的线程对于-循环。

例子

全部收缩

为a生成mex函数议案- 在可用的最大内核数上执行。

写一个matlab.®功能,test_parfor.,调用快速傅里叶变换功能,FFT., 在一个议案-循环。因为循环迭代并行运行,所以该评估可以比类似的更快完成对于-循环。

功能a = test_parfor.%#codegen.a = =(10,256);r =兰特(10,256);议案我= 1:10 a(i,:) =真实(fft(r(i)));结束结束

生成MEX功能test_parfor.。在MATLAB命令行,输入:

Codegen.test_parfor.

Codegen.生成MEX功能,test_parfor_mex.,在当前文件夹中。

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

test_parfor_mex.

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

为生成MEX函数时指定最大线程数议案-循环。

写一个matlab函数,specify_num_threads.,使用输入,,指定最大线程数议案-循环。

功能y = specify_num_threads(u)%#codegen.Y = =(1,100);%U指定最大线程数议案(i = 1:100,u)y(i)= i;结束结束

生成MEX功能specify_num_threads.。采用-Args 0.指定输入的类型。在MATLAB命令行,输入:

%-args 0指定输入U是标量级%U由代码生成器到整数的键盘Codegen.-报告specify_num_threads.-  args.0.

Codegen.生成MEX功能,specify_num_threads_mex.,在当前文件夹中。

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

specify_num_threads_mex(4)

生成的MEX函数最多可运行四个核心。如果可用少于四个核心,则MEX函数在呼叫时可用的最大核心运行。

在生成MEX函数之前禁用并行化议案-循环。

写一个matlab函数,test_parfor.,调用快速傅里叶变换功能,FFT., 在一个议案-循环。

功能a = test_parfor.%#codegen.a = =(10,256);r =兰特(10,256);议案我= 1:10 a(i,:) =真实(fft(r(i)));结束结束

生成MEX功能test_parfor.。禁用OpenMP的使用方式Codegen.不会生成可以在多个线程上运行的mex函数。

Codegen.-O禁用:OpenMP.test_parfor.

Codegen.生成MEX功能,test_parfor_mex.,在当前文件夹中。

运行mex函数。

test_parfor_mex.

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

如果禁用并行化,Matlab Coder™对待议案- 乐队对于- 砍伐。该软件生成在单个线程上运行的MEX函数。禁用并行化以比较生成的MEX函数或C / C ++代码的串行和并行版本的性能。您还可以禁用并行化以使用并行版本调试问题。

输入参数

全部收缩

循环索引变量其初始值是initval.最终价值是endval.

循环索引变量的初始值,Loopvar.。借endval.,指定议案范围向量,必须是表格M:N.

循环索引变量的最终值,Loopvar.。借initval.,指定议案范围向量,必须是表格M:N.

Matlab命令系列执行议案-循环。

如果将多个语句放在同一行上,请使用分号分隔语句。例如:

议案i = 1:10 arr(i)= rand();arr(i)= 2 * arr(i)-1;结束

要使用的最大线程数。如果指定上限,Matlab编码器即使有其他核心可用,也不使用此号码。如果您要求更多的线程,而不是可用核心的数量,Matlab编码器使用呼叫时使用的最大核心数。如果循环迭代少于线程,则某些线程不执行任何工作。

如果是议案-loop无法在多个线程上运行(例如,如果只有一个核心或可用或numthreads.是0),Matlab编码器以串行方式执行循环。

限制

  • 您必须使用支持打开多处理(OpenMP)应用程序界面的编译万博1manbetx器。看到万博1manbetx支持的编译器。如果您使用不支持OpenMP的编译器,万博1manbetxMatlab编码器对待议案- 乐队对于- 砍伐。在生成的MEX函数或C / C ++代码中,循环迭代在单个线程上运行。

  • OpenMP应用程序界面与JIT MEX编译不兼容。看到JIT汇编不支持OpenMP万博1manbetx

  • 不要在内部使用以下构造议案- 砍伐:

    • 您无法使用外部功能编码器.Extrinsic.在一个身体议案-循环。

    • 您无法在A内写入全局变量议案-循环。

    • Matlab编码器不支持使用万博1manbetx编码器.CEVAL.减少。例如,您无法为以下内生成代码议案-循环:

      议案i = 1:4 y = coder.ceval('mycfcn',义);结束
      相反,编写一个呼叫C代码的本地功能编码器.CEVAL.并致电这个功能议案-循环。例如:
      议案i = 1:4 y = callmycfcn(y,i);结束功能y = callmycfcn(y,i)y = coder.ceval('mcyfcn', 义);结束

    • 你不能使用varargin.要么varargout.议案- 砍伐。

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

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

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

提示

  • 用一个议案- 辛:

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

    • 您有需要很长时间才能执行的循环迭代。

  • 不要使用议案- 循环中的迭代取决于其他迭代的结果时。

    减少是此规则的一个例外。一种减少变量累积取决于所有迭代的值,但与迭代顺序无关。

  • 输入论点numthreads.设置OpenMP.num_threads()生成代码中的子句。OpenMP还支持通过设万博1manbetx置环境变量全局限制C / C ++中的线程数OMP_NUM_THREADS.或者使用OMP_SET_NUM_THREADS()。有关更多信息,请参阅OpenMP规范。https://www.openmp.org/specifications/

在R2012B中介绍