这个例子展示了如何在MATLAB之间跟踪(突出显示部分)®源代码和生成的CUDA®码。源代码和生成的代码之间的跟踪可以帮助你:
理解代码生成器如何将你的算法映射到GPU内核。
生成的代码中的调试问题。
评估生成的代码的质量。
您可以使用以下方法之一进行跟踪:
配置GPU编码器™生成代码,其中包括MATLAB源代码注释。在评论中,可追溯性标签后面紧跟的源代码的每一行。可追溯性标签提供了有关源代码的位置的详细信息。如果您有嵌入式编码®在代码生成报告,可追溯性标签链接到相应的MATLAB源代码。
随着嵌入式编码,产生一个代码生成报告,其中包括互动可追溯性。在报告中的交互式跟踪帮助你可视化的MATLAB源代码和所生成的C / C ++代码之间的映射。看到交互跟踪MATLAB代码和生成的C / C ++代码之间(嵌入式编码)。
为了说明可跟踪性标记,本示例使用在CPU上运行的标准MATLAB命令来实现曼德尔布罗特集。方法中提供的代码是此实现的基础与MATLAB实验电子书由克里夫·莫勒尔。
Mandelbrot集是在复平面组成的值的区域ž0一种用于通过这个方程定义的轨迹在保持有界ķ→∞。
创建一个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)和虚数部分(ÿ)通过规定的限值之间xlim
和ylim
。您可以使用这些输入验证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功能可能被错误地标记。
代码生成
|coder.CodeConfig
|coder.EmbeddedCodeConfig
|coder.gpuConfig