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

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

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

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

  • 评估生成的代码的质量。

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

  • 配置GPU编码器™生成代码,其中包括MATLAB源代码注释。在评论中,可追溯性标签后面紧跟的源代码的每一行。可追溯性标签提供了有关源代码的位置的详细信息。如果您有嵌入式编码®在代码生成报告,可追溯性标签链接到相应的MATLAB源代码。

  • 随着嵌入式编码,产生一个代码生成报告,其中包括互动可追溯性。在报告中的交互式跟踪帮助你可视化的MATLAB源代码和所生成的C / C ++代码之间的映射。看到交互跟踪MATLAB代码和生成的C / C ++代码之间(嵌入式编码)。

生成的可追溯性标记

创建MATLAB源代码

为了说明可跟踪性标记,本示例使用在CPU上运行的标准MATLAB命令来实现曼德尔布罗特集。方法中提供的代码是此实现的基础与MATLAB实验电子书由克里夫·莫勒尔。

Mandelbrot集是在复平面组成的值的区域ž0一种用于通过这个方程定义的轨迹在保持有界ķ→∞

ž ķ + 1 = ž ķ 2 + ž 0 ķ = 0 1 ...

创建一个MATLAB函数调用mandelbrot_count.m用下面的代码行。此代码是一个矢量MATLAB实现Mandelbrot集的。对于每一个点(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 + Z 0;内部= ABS(Z)<= 2;计数=计数+内部;结束计数= LOG(计数);

创建测试向量

通过使用下面的代码行创建的入口点函数的测试向量。脚本生成的实部一个1000×1000网格(X)和虚数部分(ÿ)通过规定的限值之间xlimylim。您可以使用这些输入验证mandelbrot_count入口点函数,并绘制得到的曼德尔布罗特集。

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”;代码生成-configCFG-args{maxIterations, xGrid, yGrid}mandelbrot_count

    注意

    --fmad = FALSE时传递给NVCC,指示编译器禁用浮点乘加(FMAD)优化。该选项是为了防止数值不匹配的,因为CPU和GPU在结构上的差异所产生的代码。欲了解更多信息,请参阅CPU和GPU之间的数值差异

访问报告

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

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

MATLAB源窗格中,选择mandelbrot_count.m。你看在代码窗格中的MATLAB源代码。

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

浏览为mandelbrot_count.m入口点函数,选择mandelbrot_count.cu生成的代码窗格。

可追溯性标签的格式

在生成的代码,追踪标签注释的MATLAB源代码之前,立即出现。标签的格式为:
<文件名>:<行号>

例如,该意见表明代码z0 = xGrid + 1i*yGrid;出现在一行在源文件中mandelbrot_count.m

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

可追溯性标签限制

  • 你不能在MATLAB源代码作为征求意见:

    • MathWorks公司®工具箱函数

    • P码

  • 的注释的外观或位置可以改变:

    • 例如,即使实现代码被删除了,注释仍然可以出现在生成的代码中。

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

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

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

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

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

  • 这被映射到库调用,如cuDNN,CUBLAS和CUFFT代码不会被高亮显示。其结果是,被完全映射到GPU功能可能被错误地标记。

也可以看看

|||

相关的话题