主要内容

parfor

平行线循环

描述

例子

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

parfor-loop执行语句对于价值观Loopvar.之间InitValendval.Loopvar.指定增加1的整数值的向量。

例子

parfor (Loopvar.InitValendval.numthreads.);语句;结束最多使用numthreads.创建并行时的线程循环。

例子

全部收缩

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

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

功能a = test_parfor.% # codegen一个= 1 (10256);r =兰德(10256);parfor我= 1:10 a(i,:) =真实(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,100);% u指定最大线程数parfor(i = 1:100,u) y(i) = i结束结束

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

% -args 0指定输入u是一个标量双精度%U由代码生成器到整数的键盘codegen-报告specify_num_threads.arg游戏0

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

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

specify_num_threads_mex (4)

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

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

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

功能a = test_parfor.% # codegen一个= 1 (10256);r =兰德(10256);parfor我= 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编码器™对待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编码器不支持的使用金宝app编码器.CEVAL.在减少。例如,您不能生成以下代码parfor循环:

      parfory = code .ceval(“myCFcn”,义);结束
      相反,编写一个呼叫C代码的本地功能编码器.CEVAL.调用这个函数parfor循环。例如:
      parfori = 1:4 y = callmycfcn(y,i);结束功能y = callMyCFcn(y,i) y = code .ceval('mcyfcn', i);结束

    • 你不能使用变长度输入宗量或者varargout.parfor- 砍伐。

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

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

有关限制的全面列表,请参见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中介绍