主要内容

自动并行化为了生成的代码中的循环

并行迭代为了循环可以在目标硬件上的多个核上同时运行。一段代码的并行化可能会显着提高所生成的代码的执行速度。看Paret-Lops如何提高执行速度

从MATLAB生成C / C ++代码时®代码,您可以生成并行为了自动循环。自动并行化是一个编译器转换,它将顺序代码转换为多线程代码而无需手动干预。

自动并行化为了循环支持C金宝app / C ++目标的这些构建类型:MEX,静态库,动态链接库和可执行文件。

并行化为了循环通过使用马铃薯编码器应用程序

启用自动并行化为了循环,在Matlab Coder™应用程序,在生成代码步骤,选择更多设置>速度>启用自动并行化

GUI启用自动并行化

并行化为了循环在命令行

您可以启用并行化为了使用命令行界面循环。考虑该功能autoparexample.

功能x = autoparexample(x)%#codegen.为了i = 10:numel(x)x(i)= sqrt(x(i));结尾结尾

自动生成并行为了循环,运行这些命令:

cfg = coder.config('lib');CFG.ENABLEAUTOPARALLINATIZATIZ = 1;x =兰特(1,2000);Codegen.-Config.CFG.autoparexample.-  args.{X}-报告
代码成功:查看报告

检查生成的代码和代码洞察

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

生成的代码

观察在上面产生的开放式多处理(OpenMP)Pragmas为了循环。

void autoparexample(double x [2000]){int i;if(!isinitialized_autoparexample){autoparexample_initialize();}#pragma对num_threads的pations(op_get_max_threads())私有(i)for(i = 0; i <1991; i ++){x [i + 9] = sqrt(x [i + 9]);}}

循环旁边的绿色突出显示的沟槽显示了并行化的代码的一部分。

突出显示与循环并行

代码见解

在里面代码见解标签,下面自动并行化问题,您可以查看有关的详细信息为了在生成的代码中不行化的循环。

例如,要查看特定的代码洞察力,请再次生成代码autoparexample.您在上一节中定义的功能。为输入参数指定较小尺寸。

cfg = coder.config('lib');CFG.ENABLEAUTOPARALLINATIZATIZ = 1;x = rand(1,1000);Codegen.-Config.CFG.autoparexample.-  args.{X}-报告

生成的代码不包含并行为了由于输入参数的大小小于自动并行化的阈值。打开报告并单击代码见解>自动并行化问题查看有关代码的非并行化部分的详细信息。

代码洞察关于代码的非并行化部分

禁用a的自动并行化为了环形

如果在串行执行中更好地执行该循环,则可能希望禁用特定循环的自动并行化。防止特定的并行化为了循环,放置Coder.Loop.Parallelize('从不')Pragma立即在Matlab代码中的循环之前。这个pragma覆盖了EnableAutopar平行化环境。此外,这个Pragma只支持那些金宝app为了在MATLAB代码中明确定义的循环。有关显式和隐式循环的更多信息,请参阅下一节。

例如,代码生成器不行化此循环:

%pragma禁用用于循环的自动并行化Coder.Loop.Parallelize('绝不');为了i = 1:n y(i)= y(i)* sin(i);结尾

编码器.Loop.Parallelize.

并行化隐式为了循环

示例功能autoparexample.在上一节中使用的是明确的为了环形。但您的MATLAB代码也可以包含隐式为了在您作者的代码中没有明确出现的循环。例如,matlab函数m将两个矩阵乘以,因此必须在矩阵元素上隐式地执行循环迭代。

自动并行化支持MATLAB代码中隐含的循环。金宝app例如,考虑此功能autoparexample_implicit.

功能y = autoparexample_implisic(y)%#codegen.Y = Y * 17;%生成隐式循环结尾

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

cfg = coder.config('lib');CFG.ENABLEAUTOPARALLINATIZATIZ = 1;y = rand(1,2000);Codegen.-Config.CFG.autoparexample_implicit.-  args.{Y}-报告

打开报告并检查生成的代码。生成的代码包含用于乘法操作的循环并行。

void autoparexample_implisic(double y [2000]){int i;if(!isinitialized_autoparexample_implisic){autoparexample_implic_initialize();}#pragma对num_threads的pations(op_get_max_threads())私有(i)for(i = 0; i <2000; i ++){y [i] * = 17.0;}

使用说明和限制

也可以看看

|||||

相关话题