验证生成的代码的正确性
生成代码后,GPU Coder™为您提供了多个选项来检查源代码并测试生成代码的正确性。
代码生成报告提供了一个交互式界面,用于检查生成的CUDA®源文件、生成的数据类型和其他代码见解。有关更多信息,请参见代码生成报告.
在GPU Coder应用程序中验证生成的MEX函数。
在命令行上验证生成的MEX函数。
与MATLAB®编码器™金宝appNVIDIA的支持包®Jetson和NVIDIA DRIVE平台,您可以使用循环中处理器(PIL)执行来检查从MATLAB函数生成的CUDA代码的数值行为。有关更多信息,请参见从命令行执行处理器在循环(NVIDIA Jetson金宝app和NVIDIA DRIVE平台的MATLAB Coder支持包)而且处理器在循环执行与GPU编码器应用程序(NVIDIA Jetson金宝app和NVIDIA DRIVE平台的MATLAB Coder支持包).
如果你有嵌入式编码器®,您可以通过使用软件在循环(SIL)执行来验证生成的CUDA代码的数值行为。
验证GPU编码器应用程序
在GPU Coder应用程序中,生成MEX函数后,可以验证它具有与原始MATLAB入口点函数相同的功能。提供一个测试文件,为被测函数生成测试向量,然后调用原始的MATLAB入口点函数。测试文件可以是MATLAB函数或脚本,但必须与原始入口点函数位于同一文件夹中。
在生成代码“GPU Coder”应用界面,单击验证代码.
键入或选择测试文件。例如,
myfunction_test
.若要运行测试文件,而不将对原始MATLAB函数的调用替换为对MEX函数的调用,请选择MATLAB代码为运行使用选择。点击运行生成的代码.
要运行测试文件,请选择将对原始MATLAB函数的调用替换为对MEX函数的调用生成的代码为运行使用选择。点击运行生成的代码.
将运行原始MATLAB函数的结果与运行生成的CUDA MEX函数的结果进行比较。
通过命令行验证MEX功能
命令行验证生成的CUDA MEX文件coder.runTest
函数。的coder.runTest
函数通过将对原始MATLAB函数的调用替换为对MEX函数的调用来运行测试文件。例如,测试myfunction
函数与myfunction_test
测试文件,在MATLAB命令窗口中输入以下代码。
coder.runTest (“myfunction_test”,“myfunction”)
将结果与运行原始MATLAB函数的结果进行比较。如果在运行期间发生错误,则调用堆栈信息可用于调试。或者,您可以使用codegen
与以及
选择。
myfunction -test'myfunction_test'
测试文件可以是MATLAB函数、脚本或基于类的单元测试。
通过软件在环验证代码
GPU Coder支金宝app持软件在循环(SIL)执行,这使您能够验证源代码和已编译的目标代码。在通过MATLAB SIL接口执行SIL期间,软件编译并使用您提供的测试向量,在开发计算机上运行库代码。您可以重用为MATLAB函数开发的测试向量来验证库代码的数值行为。
请注意
在微软®窗户®系统,Windows防火墙可以潜在地阻止SIL的执行。更改Windows防火墙设置以允许访问。
在使用SIL执行时,请确保
基准测试
选项在GPU Coder设置是假
.使用基准测试执行SIL会导致编译错误。
SIL执行GPU编码器应用程序
循环中软件(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
要从命令行设置和启动SIL执行,您需要为库代码生成创建一个GPU Coder配置对象,启用config_obj。VerificationMode = 'SIL'
,使用codegen
函数生成库代码和SIL接口,并使用coder.runTest
函数来运行原始MATLAB函数的测试文件。下面是一个构建脚本,它自动执行一系列命令来执行SIL执行。
为静态库创建配置对象。config = code . gpuconfig (“自由”);配置。GenerateReport = true;配置。VerificationMode =“银”;为入口点'mandelbrot_count'定义参数类型。ARGS = cell(1,1);ARGS{1} = cell(3,1);ARGS{1}{1} = code .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的数值差异
由于CPU和GPU之间的架构差异,数值验证并不总是匹配的。这种情况在使用时尤其适用单
数据类型,并对这些数据执行累加操作单
数据类型值。然而,也有像Mandelbrot这样的例子双
数据类型会导致数值错误。造成这种不匹配的原因之一是GPU浮点单元使用融合的浮点乘法-加法(FMAD)指令,而CPU不使用这些指令。同样重要的是,CUDA编译器在默认情况下执行这些指令级优化会影响计算结果的准确性。例如,CUDA编译器将浮点乘法和加法指令融合为一条指令。这种浮点乘法-加法(FMAD)操作的执行速度是两个单一指令的两倍,但会导致数值精度的损失。通过使用内在函数和编译器标志,可以更严格地控制这些优化。要设置编译器标志,请参见coder.gpuConfig
.要集成CUDA intrinsic,请参见从生成的代码调用自定义CUDA设备函数.
另请参阅
应用程序
功能
对象
相关的话题
- 代码生成报告
- 从命令行执行处理器在循环(NVIDIA Jetson金宝app和NVIDIA DRIVE平台的MATLAB Coder支持包)
- 处理器在循环执行与GPU编码器应用程序(NVIDIA Jetson金宝app和NVIDIA DRIVE平台的MATLAB Coder支持包)