主要内容

自动并行化循环在生成的代码

迭代并行循环可以同时运行多个核心目标硬件。并行化部分的代码可能显著提高生成的代码的执行速度。看到parfor-Loops提高执行速度如何

而从你的MATLAB生成C / c++代码®代码中,您可以生成平行自动循环。自动并行化编译器转换,转换顺序代码多线程代码无需人工干预。

自动并行化循环支持这些金宝app构建C / c++目标类型:

  • 墨西哥人

  • 静态库

  • 动态链接库

  • 可执行的

并行化循环利用MATLAB编码器应用程序

启用自动并行化循环,MATLAB编码器™应用程序,生成代码步骤中,选择更多设置> >启用自动并行化速度

GUI启用自动并行化

并行化循环在命令行

您可以启用并行的循环使用命令行界面。考虑到功能autoparExample:

函数x = autoparExample (x)% # codegen我= 10:元素个数(x) x (i) = sqrt (x (i));结束结束

自动生成平行循环,运行这些命令:

cfg = coder.config (“自由”);cfg。EnableAutoParallelization = 1;x =兰德(2000);codegen配置cfgautoparExamplearg游戏{x}报告
代码生成成功:查看报告

检查生成的代码和代码的见解

打开并检查代码生成报告。

生成的代码

观察开放多处理(OpenMP)生成语法上面循环。

空白autoparExample(双x [2000]) {int我;如果(! isInitialized_autoparExample) {autoparExample_initialize ();}# pragma omp平行num_threads (omp_get_max_threads())私人(我)(我= 0;我< 1991;我+ +){x[我+ 9 = sqrt (x[我+ 9]);}}

旁边的排水沟中强调绿色循环显示了并行的代码的一部分。

强调并行循环

代码的见解

代码的见解选项卡,在自动并行化问题,你可以看到详细的信息循环没有并行生成的代码。

例如,要查看特定代码的洞察力,重新生成代码autoparExample在前一节中定义的函数。输入参数指定一个较小的规模。

cfg = coder.config (“自由”);cfg。EnableAutoParallelization = 1;x =兰德(1000);codegen配置cfgautoparExamplearg游戏{x}报告

生成的代码不包含并行循环,因为输入参数的大小小于阈值的自动并行化。查看详细信息的nonparallelized部分的代码,然后单击打开报告代码的见解>自动并行化问题

代码的见解关于non-parallelized代码的一部分

禁用自动并行化循环

您可能想要禁用自动并行化的一个特定的循环,如果循环执行串行执行的更好。为了防止特定的并行化循环,把coder.loop.parallelize(“不”)编译指示立即在MATLAB代码循环之前。这个编译指示覆盖EnableAutoParallelization设置。同时,这个编译指示只支持这些金宝app在MATLAB代码中显式定义的循环。在显式和隐式循环的更多信息,请参阅下一节。

例如,代码生成器并不并行化这个循环:

%编译指示禁用自动并行化的for循环coder.loop.parallelize (“永远”);i = 1: n y (i) = y(我)* sin(我);结束

看到coder.loop.parallelize

并行化隐式循环

函数的例子autoparExample在前面的部分中包含一个显式的使用循环。但是你的MATLAB代码也可以包含隐式循环不显式地出现在你的代码。例如,MATLAB函数mtimes两个矩阵乘法和必须执行隐式循环迭代矩阵元素。

自动并行化隐含在MATLAB代码支持循环。金宝app例如,考虑这个函数autoparExample_implicit

函数y = autoparExample_implicit (y)% # codegeny = y * 17;%为循环生成隐式结束

通过运行这些命令生成代码:

cfg = coder.config (“自由”);cfg。EnableAutoParallelization = 1;y =兰德(2000);codegen配置cfgautoparExample_implicitarg游戏{y}报告

打开报告,检查生成的代码。生成的代码包含一个平行的循环的乘法操作。

空白autoparExample_implicit(双y [2000]) {int我;如果(! isInitialized_autoparExample_implicit) {autoparExample_implicit_initialize ();}# pragma omp平行num_threads (omp_get_max_threads())私人(我)(我= 0;我< 2000;我+ +){y[我]* = 17.0;}

并行化循环执行还原操作

你可以并行化循环执行还原操作通过使用配置选项优化减少

要启用自动并行化循环:

  1. 打开MATLAB编码器应用程序。

  2. 生成代码页面,点击更多的设置

  3. 速度选项卡中,选择启用自动并行化优化减少复选框。

MATLAB编码器的快照优化减少

优化减少也会启用,如果你设置利用目标硬件指令集扩展参数一个您的处理器支持的指令集。金宝app

使配置选项OptimizeReductions通过使用命令行界面,运行这些命令。

cfg = coder.config (“自由”);cfg。EnableAutoParallelization = true;cfg。OptimizeReductions = true;

例如,编写一个MATLAB函数arraySum计算数组的元素的总和三机一体总和,并返回减少变量

函数= arraySum (in, a, b)金额= 0;c = 0(元素个数(in), 1);i2 = 1:元素个数(in)如果i2 > in1 (i2)和=和+ in1 (i2);c (i2) = (i2) + b (i2);结束结束=和+的意思(c);结束

在MATLAB命令行,运行这个 codegen 命令。

arr = 1:1000;codegenarraySum配置cfgarg游戏{arr, arr, arr}报告
代码生成成功:查看报告

打开代码生成报告通过点击查看报告,看并行循环的加法操作。

金额= 0.0;# pragma omp并行num_threads (omp_get_max_threads())私人(sumPrime d){sumPrime = 0.0;# pragma omp nowait(i2 = 0;i2 < 1000;i2 + +) {c (i2) = 0.0;d = in (i2);如果(> 1.0(双)i2 + d) {sumPrime + = d;c (i2) = a + b (i2) (i2);}}omp_set_nest_lock (&autoparExample_nestLockGlobal);{+ = sumPrime总和;}omp_unset_nest_lock (&autoparExample_nestLockGlobal);}

使用笔记和局限性

另请参阅

|||||

相关的话题