生成的CUDA代码和MATLAB源代码之间的跟踪
这个例子展示了如何在MATLAB之间跟踪(突出显示部分)®源代码和生成的CUDA®代码。跟踪源代码和生成的代码可以帮助您:
了解代码生成器如何将算法映射到GPU内核。
生成的代码中的调试问题。
评估生成代码的质量。
您可以使用以下方法之一进行跟踪:
配置GPU Coder™以生成包含MATLAB源代码作为注释的代码。在注释中,可追溯性标记立即位于源代码的每一行之前。可追溯性标记提供了关于源代码位置的详细信息。如果你有嵌入式编码器®,在代码生成报告中,将溯源标签链接到相应的MATLAB源代码。
使用嵌入式编码器,生成包含交互式可跟踪性的代码生成报告。报告中的交互式跟踪帮助您可视化MATLAB源代码和生成的C/ c++代码之间的映射。看到MATLAB代码与生成的C/ c++代码的交互跟踪(嵌入式编码).
生成可追溯性标签
创建MATLAB源代码
为了演示可追溯性标记,本示例使用了Mandelbrot集的实现,它使用在CPU上运行的标准MATLAB命令。方法中提供的代码是此实现的基础MATLAB实验克莱夫·莫尔的电子书。
曼德尔布罗特集是复平面上由这些值组成的区域z0由这个方程定义的轨迹在k→∞.
创建一个MATLAB函数叫做mandelbrot_count.m
使用下面的代码行。此代码是Mandelbrot集的矢量化MATLAB实现。对于每一点(xGrid yGrid)
在网格中,它计算迭代索引数
在此点,由方程定义的轨迹达到的距离2
从原点开始。然后返回的自然对数数
,用于生成Mandelbrot集的彩色编码图。
函数count = mandelbrot_count(maxIterations,xGrid,yGrid)添加kernelfun pragma来触发内核创建coder.gpu.kernelfun;% mandelbrot计算z0 = xGrid + 1i*yGrid;Count = ones(size(z0));Z = z0;为n = 0:maxIterations z = z.*z + z0;Inside = abs(z)<=2;计数=计数+内部;结束Count = log(Count);
创建测试向量
使用以下代码行为入口点函数创建测试向量。该脚本生成一个1000 x 1000的实际部件网格(x)和虚部(y)所指明的极限之间xlim
而且ylim
.您可以使用这些输入来验证mandelbrot_count
入口点函数并绘制得到的曼德尔布罗特集。
maxIterations = 500;gridSize = 1000;Xlim = [-0.748766713922161,-0.748766707771757];Ylim = [0.123640844894862,0.123640851045266];x = linspace(xlim(1),xlim(2),gridSize);y = linspace(ylim(1),ylim(2),gridSize);[xGrid,yGrid] = meshgrid(x,y);
生成可追溯性标签
要在生成的代码中产生可追溯性标签,可以将MATLAB源代码作为注释生成。
在“GPU Coder”应用中设置作为注释的MATLAB源代码来
是的
.在代码生成配置对象中,创建
coder.gpuConfig
对象,并设置MATLABSourceComments
财产真正的
.cfg = code . 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的函数可能会被错误地标记。
另请参阅
codegen
|coder.gpuConfig
|编码器。CodeConfig
|编码器。EmbeddedCodeConfig