主要内容

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

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

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

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

  • 评估生成代码的质量。

你可以使用以下方法进行跟踪:

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

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

生成的可追溯性标记

创建MATLAB源代码

为了说明可跟踪标签,本示例使用了Mandelbrot集的一个实现,它使用了在CPU上运行的标准MATLAB命令。方法中提供的代码为基础用MATLAB进行实验克里夫·莫勒的电子书。

Mandelbrot集是由值组成的复平面中的区域Z0该方程定义的轨迹保持有界于K→∞.

Z K + 1. = Z K 2. + Z 0 , K = 0 , 1. ,

创建一个MATLAB函数调用曼德尔布罗特伯爵带有以下代码行。此代码是Mandelbrot集的矢量化MATLAB实现。适用于每个点(xGrid,yGrid)在网格中计算迭代指标计数方程定义的轨迹到达距离2.从原点。然后返回的自然对数计数,用于生成Mandelbrot集的彩色编码图。

函数数= mandelbrot_count (maxIterations xGrid yGrid)添加kernelfun命令来触发内核创建coder.gpu.kernelfun;%曼德布罗特计算z0 = xGrid + 1i*yGrid;数= 1(大小(z0));z = z0;对于n=0:maxz=z.*z+z0;内侧=abs(z)<=2;计数=计数+内部;结束计数=对数(计数);

创建测试向量

使用以下代码行为入口点函数创建测试向量。该脚本生成1000 x 1000的真实零件网格(x)虚部(Y)在xlimylim。您可以使用这些输入来验证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编码器应用程序中,设置MATLAB源代码作为注释.

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

    cfg=coder.gpuConfig(“dll”,“ecoder”,真正的);cfg。GenerateReport = true;cfg。MATLABSourceComments = true;cfg.GpuConfig.CompilerFlags =“——fmad = false”;编码基因-配置cfg-args{maxIterations, xGrid, yGrid}mandelbrot_count

    这个--fmad=错误国旗传递给nvcc,指示编译器禁用浮点乘加(FMAD)优化。设置此选项是为了防止由于CPU和GPU的体系结构差异而在生成的代码中出现数字不匹配。有关详细信息,请参阅CPU和GPU之间的数值差异.

访问报告

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

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

MATLAB源代码窗格中,选择曼德尔布罗特伯爵. 您可以在“代码”窗格中看到MATLAB源代码。

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

要查看为曼德尔布罗特伯爵入口点功能,选择mandelbrot_count.cu生成代码窗格。

可追溯性标签的格式

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

例如,此注释表示代码z0 = xGrid + 1i*yGrid;出现在一行5.在源文件中曼德尔布罗特伯爵.

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

可追溯性标签限制

  • 您不能将MATLAB源代码作为注释包含在以下内容中:

    • 迈斯沃克®工具箱函数

    • P代码

  • 注释的外观或位置可能会有所不同:

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

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

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

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

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

  • 调用编码器功能,如coder.nullcopy将不会突出显示

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

另见

|||

相关的话题