这个例子展示了如何在MATLAB之间跟踪(突出显示部分)®源代码和生成的CUDA®代码。跟踪源代码和生成代码之间的关系可以帮助您:
了解代码生成器如何将算法映射到GPU内核。
调试生成的代码中的问题。
评估生成代码的质量。
你可以使用以下方法进行跟踪:
配置GPU Coder™以生成包含MATLAB源代码作为注释的代码。在注释中,每一行源代码前面都有一个跟踪标记。可跟踪性标记提供有关源代码位置的详细信息。如果你有嵌入式编码器®,在代码生成报告,追溯标签链接到相应的MATLAB源代码。
使用Embedded Coder,生成包含交互式可跟踪性的代码生成报告。报告中的交互式跟踪帮助您可视化MATLAB源代码和生成的C/ c++代码之间的映射。看到交互式跟踪MATLAB代码和生成的C/ c++代码(嵌入式编码).
为了说明可跟踪标签,本示例使用了Mandelbrot集的一个实现,它使用了在CPU上运行的标准MATLAB命令。方法中提供的代码为基础与MATLAB实验克里夫·莫勒(Cleve Moler)的电子书。
曼德尔勃洛特集是复平面中由这些值组成的区域z0由这个方程定义的轨迹是有界的k→∞.
创建一个MATLAB函数调用mandelbrot_count.m
用下面的代码行。这段代码是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:maxIterations z = z.*z + z0;在= abs (z) < = 2;Count = Count +内部;结束数=日志(数);
使用下面的代码行创建入口点函数的测试向量。该脚本生成一个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编码器应用程序中,设置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
或者选择不同的代码。
要查看为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的函数可能标记不正确。
codegen
|编码器。CodeConfig
|编码器。EmbeddedCodeConfig
|coder.gpuConfig