在您生成代码后,GPU编码器™为您提供多个选项来检查源代码和测试生成代码的正确性。
代码生成报告为检查生成的CUDA提供了一个交互界面®源文件、生成的数据类型和其他代码洞察。有关更多信息,请参见代码生成报告.
在GPU Coder应用程序中验证生成的MEX函数。
在命令行验证生成的MEX函数。
与MATLAB®编码器™金宝app支持包的NVIDIA®在Jetson和NVIDIA驱动平台上,您可以使用处理器在循环(PIL)执行来检查您从MATLAB函数生成的CUDA代码的数值行为。有关更多信息,请参见从命令行执行循环处理器(NVIDIA Jetson金宝app和NVIDIA DRIVE平台的MATLAB编码器支持包)和使用GPU编码器应用程序在循环中执行处理器(NVIDIA Jetson金宝app和NVIDIA DRIVE平台的MATLAB编码器支持包).
如果你有嵌入式编码器®,您可以通过使用软件在循环(SIL)执行来验证生成的CUDA代码的数值行为。
在GPU Coder应用程序中,生成MEX函数后,可以验证它与原始MATLAB入口点函数具有相同的功能。提供一个测试文件,为被测函数生成测试向量,然后调用原始MATLAB入口点函数。测试文件可以是MATLAB函数或脚本,但必须在与原始入口点函数相同的文件夹中。
在生成代码在GPU编码器应用界面,单击验证代码.
键入或选择测试文件。例如,myfunction_test
.
要运行测试文件,而不使用对MEX函数的调用替换对原始MATLAB函数的调用,请选择MATLAB代码为运行使用选择。点击运行生成的代码.
要运行测试文件,将对原始MATLAB函数的调用替换为对MEX函数的调用,选择生成的代码为运行使用选择。点击运行生成的代码.
将原MATLAB函数的运行结果与生成的CUDA MEX函数的运行结果进行比较。
控件可以在命令行中验证生成的CUDA MEX文件coder.runTest
函数。的coder.runTest
函数通过用对MEX函数的调用替换对原始MATLAB函数的调用来运行测试文件。例如,测试myfunction
函数与myfunction_test
测试文件,在MATLAB命令窗口中输入以下代码。
coder.runTest (“myfunction_test”,“myfunction”)
将结果与运行原MATLAB函数的结果进行比较。如果在运行期间发生错误,则可以使用调用堆栈信息进行调试。或者,您可以使用codegen
与以及
选择。
codegen myfunction以及'myfunction_test”
测试文件可以是MATLAB函数、脚本或基于类的单元测试。
GPU编码器支持软件金宝app在循环(SIL)执行,使您能够验证源代码和编译的目标代码。在通过MATLAB SIL接口执行SIL时,软件编译并使用您提供的测试向量,在您的开发计算机上运行库代码。您可以重用为MATLAB函数开发的测试向量,以验证库代码的数值行为。
请注意
在微软®窗户®Windows防火墙可能会阻止SIL的执行。更改Windows防火墙设置以允许访问。
当使用SIL执行时,确保基准测试
“GPU编码器设置”选项为假
.使用基准测试执行SIL会导致编译错误。
只支持静态和动态库输出类型的软件在循环(SIL)执行。金宝app如果生成了MEX函数,则必须更改要使用的项目设置静态库
或动态库
为构建类型和运行生成代码一次。
打开GPU编码器应用程序,在MATLAB工具条上应用程序选项卡,在代码生成,单击应用程序图标。
要打开项目,单击,然后单击打开现有的项目
.选择项目,myproject.prj
.在生成代码页面,点击生成箭头.
在生成对话框:
集构建类型来静态库
或动态库
.
清除只生成代码复选框。
您可以将其他设置保留为默认值。
要生成CUDA代码,请单击生成.点击验证代码.
在命令字段中,指定测试文件(例如,myfunction_test.m
)调用原始MATLAB函数(例如,myfunction
).
要启动SIL执行,单击运行生成的代码.GPU编码器应用程序:
中生成独立库codegen \ lib \ myfunction
.
中生成SIL接口代码myfunction codegen \ lib \ \硅
.
运行测试文件,将对MATLAB函数的调用替换为对库中生成代码的调用。
控件中显示来自SIL执行的消息测试输出选项卡。
验证SIL执行的结果与原始MATLAB函数的结果相匹配。
要终止SIL执行过程,单击停止SIL确认.另外,在测试输出选项卡,单击下面的链接终止执行
.
要从命令行设置并启动SIL执行,您需要创建一个用于库代码生成的GPU Coder配置对象,启用config_obj。VerificationMode =“银”
,使用codegen
函数来生成库代码和SIL接口,并使用coder.runTest
函数来运行原始MATLAB函数的测试文件。下面是一个构建脚本,它自动执行执行SIL的一系列命令。
为静态库创建配置对象。配置= coder.gpuConfig (“自由”);配置。GenerateReport = true;配置。VerificationMode =“银”;%%为入口点'mandelbrot_count'定义参数类型。ARGS =细胞(1,1);ARGS{1} =细胞(3,1);ARGS {1} {1} = coder.typeof (0);ARGS{1}{2} =编码器。typeof(0, 1000年[1000]);ARGS{1}{3} =编码器。typeof(0, 1000年[1000]);%%调用GPU编码器。codegen配置配置myfunctionarg游戏ARGS {1}%%使用sil接口运行测试文件coder.runTest (“myfunction_test”, (“myfunction_sil”。mexext]);%%终止SIL执行清晰的myfunction_sil;
由于CPU和GPU之间的架构差异,数值验证并不总是匹配的。在使用时尤其如此单
在MATLAB代码中输入数据类型,并对其执行累积操作单
数据类型的值。然而,在曼德尔布罗特的例子中,甚至双
数据类型会导致数值错误。这种不匹配的一个原因是GPU浮点单元使用融合浮点乘法加(FMAD)指令,而CPU不使用这些指令。同样需要注意的是,CUDA编译器在默认情况下执行这些指令级优化,这将影响计算结果的准确性。例如,CUDA编译器将浮点乘法和加法指令融合到单个指令中。这个浮点乘法加(FMAD)操作的执行速度是两个单一指令的两倍,但会导致数值精度的损失。您可以通过使用内在函数和编译器标志来实现对这些优化的更严格控制。要设置编译器标志,请参见coder.gpuConfig
.要集成CUDA的内在特性,请看遗留代码集成.