主要内容

生成CUDA代码和MATLAB源代码之间的跟踪

这个例子展示了如何在MATLAB之间跟踪(突出显示部分)®源代码和生成的CUDA®代码。在源代码和生成的代码之间跟踪可以帮助您:

  • 理解代码生成器如何将算法映射到GPU内核。

  • 调试生成代码中的问题。

  • 评估生成代码的质量。

您可以使用以下方法之一进行跟踪:

  • 配置GPU Coder™以生成包含MATLAB源代码作为注释的代码。在注释中,每一行源代码的前面都有一个跟踪标记。可追溯标记提供了关于源代码位置的详细信息。如果你有嵌入式编码器®,在代码生成报告中,可追溯标签链接到相应的MATLAB源代码。

  • 使用嵌入式Coder,生成包含交互式可跟踪性的代码生成报告。报告中的交互式跟踪帮助您可视化MATLAB源代码和生成的C/ c++代码之间的映射。看到MATLAB代码与生成的C/ c++代码的交互跟踪(嵌入式编码)

生成的可追溯性标记

创建MATLAB源代码

为了演示可跟踪性标记,本示例使用在CPU上运行的标准MATLAB命令来实现Mandelbrot集。的代码提供了此实现的基础与MATLAB实验克利夫·莫勒的电子书。

曼德尔布罗特集是复平面上由这些值组成的区域z0这个方程定义的轨迹有界于k→∞

z k + 1 z k 2 + z 0 k 0 1 ...

创建一个MATLAB函数叫做mandelbrot_count.m使用以下代码行。这段代码是Mandelbrot集合的向量化MATLAB实现。对每一个点(xGrid yGrid)在网格中,它计算迭代索引由方程定义的轨迹到达的距离2从原点。然后返回的自然对数,用于生成Mandelbrot集的彩色编码图。

函数数= mandelbrot_count (maxIterations xGrid yGrid)添加kernelfun pragma来触发内核创建coder.gpu.kernelfun;曼德布洛特百分比计算z0 = xGrid + 1i*yGrid;数= 1(大小(z0));z = z0;n = 0:maxIterations z = z.*z + z0;在= abs (z) < = 2;Count = Count + inside;结束数=日志(数);

创建测试向量

使用以下代码行为入口点函数创建测试向量。该脚本生成一个1000 x 1000的实部件网格(x)和虚部(y)之间指定的限制xlim而且ylim.可以使用这些输入来验证mandelbrot_count入口点函数,并绘制得到的Mandelbrot集。

maxIterations = 500;gridSize = 1000;xlim = [-0.748766713922161, -0.748766707771757];ylim = [0.123640844894862, 0.123640851045266];xlim x = linspace (xlim (1), (2), gridSize);ylim y = linspace (ylim (1), (2), gridSize);[xGrid, yGrid] = meshgrid (x, y);

生成的可追溯性标记

要在生成的代码中生成可跟踪标记,可以将MATLAB源代码作为注释生成。

  • 在GPU Coder应用中,设置MATLAB源代码作为注释是的

  • 在代码生成配置对象中,创建一个coder.gpuConfig对象,并设置MATLABSourceComments财产真正的

    cfg = coder.gpuConfig (“dll”“是”,真正的);cfg。GenerateReport = true;cfg。MATLABSourceComments = true;cfg.GpuConfig.CompilerFlags =“——fmad = false”;codegen配置cfgarg游戏{maxIterations, xGrid, yGrid}mandelbrot_count

    请注意

    ——fmad = false标记时传递给学校网站,指示编译器禁用浮点乘法(FMAD)优化。设置此选项是为了防止由于CPU和GPU的架构差异而导致生成代码中的数值不匹配。有关更多信息,请参见CPU和GPU的数值差异

访问报告

要打开代码生成报告,请单击查看报告

命名代码生成报告report.mldatx.它位于超文本标记语言代码生成输出文件夹的子文件夹。如果你有MATLAB R2018a或更高版本,你可以打开report.mldatx通过双击它来文件。

MATLAB源窗格中,选择mandelbrot_count.m.您可以在代码窗格中看到MATLAB源代码。

绿色的GPU旁边的标记mandelbrot_count函数表示生成的代码同时具有CPU段和GPU段。绿色的竖条表示映射到GPU的代码行。查看有关变量或表达式的类型以及相应的名称的信息GPU核函数,在变量或表达式上方暂停。当您通过单击选中高亮显示的代码时,代码会变成蓝色,即使您将指针移出所选内容,也可以看到信息。在按下之前,代码保持选中状态Esc或者选择不同的代码。

工具生成的CUDA代码mandelbrot_count.m入口点函数,选择mandelbrot_count.cu生成的代码窗格。

追溯标签的格式

在生成的代码中,可跟踪性标记出现在注释中MATLAB源代码的前面。标签的格式为:
<文件名>:<行号>

例如,此注释指示代码z0 = xGrid + 1i*yGrid;出现在一行5在源文件中mandelbrot_count.m

/*“mandelbrot_count: 5”z0 = xGrid + 1i*yGrid;

可追溯性标记的局限性

  • 您不能将MATLAB源代码作为以下注释:

    • MathWorks®工具箱函数

    • p代码

  • 注释的外观或位置可以不同:

    • 即使实现代码被删除,例如,由于不断的折叠,注释仍然可以出现在生成的代码中。

    • 如果删除了一个完整的函数或代码块,则可以从生成的代码中删除注释。

    • 对于某些优化,注释可以与生成的代码分离。

    • 即使您不选择在生成的代码中包含源代码注释,生成的代码也会包含来自MATLAB源代码的合法要求的注释。

  • 具有多个输出的函数不会突出显示。

  • 调用编码器等功能coder.nullcopy不会高亮显示

  • 映射到库调用(如cuDNN、cuBLAS和cuFFT)的代码将不会突出显示。因此,完全映射到GPU的函数可能被标记错误。

另请参阅

|||

相关的话题

Baidu
map