自动并行化为
循环在生成的代码
迭代并行为
循环可以同时运行多个核心目标硬件。并行化部分的代码可能显著提高生成的代码的执行速度。看到parfor-Loops提高执行速度如何。
而从你的MATLAB生成C / c++代码®代码中,您可以生成平行为
自动循环。自动并行化编译器转换,转换顺序代码多线程代码无需人工干预。
自动并行化为
循环支持这些金宝app构建C / c++目标类型:
墨西哥人
静态库
动态链接库
可执行的
并行化为
循环利用MATLAB编码器应用程序
启用自动并行化为
循环,MATLAB编码器™应用程序,生成代码步骤中,选择更多设置> >启用自动并行化速度。
并行化为
循环在命令行
您可以启用并行的为
循环使用命令行界面。考虑到功能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部分的代码,然后单击打开报告代码的见解>自动并行化问题。
禁用自动并行化为
循环
您可能想要禁用自动并行化的一个特定的循环,如果循环执行串行执行的更好。为了防止特定的并行化为
循环,把coder.loop.parallelize(“不”)
编译指示立即在MATLAB代码循环之前。这个编译指示覆盖EnableAutoParallelization
设置。同时,这个编译指示只支持这些金宝app为
在MATLAB代码中显式定义的循环。在显式和隐式循环的更多信息,请参阅下一节。
例如,代码生成器并不并行化这个循环:
%编译指示禁用自动并行化的for循环coder.loop.parallelize (“永远”);为i = 1: n y (i) = y(我)* sin(我);结束
并行化隐式为
循环
函数的例子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;}
并行化为
循环执行还原操作
你可以并行化为
循环执行还原操作通过使用配置选项优化减少。
要启用自动并行化为
循环:
打开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);}
使用笔记和局限性
空循环和
而
循环并不自动并行化只有减少算术操作加(+)、减(-)、产品(*),逻辑运算符(&),或(|)支持自动并行化的代码生成。金宝app
另请参阅
parfor
|coder.loop.parallelize
|coder.config
|coder.MexCodeConfig
|coder.CodeConfig
|coder.EmbeddedCodeConfig