在您生成代码后,GPU Coder™为您提供了多个选项来检查源代码和测试生成代码的正确性。
代码生成报告提供了一个交互式界面,用于检查生成的CUDA®c++源文件、生成的数据类型和其他代码分析。有关更多信息,请参见代码生成报告(MATLAB编码器)。
验证在GPU编码器应用程序中生成的MEX功能。
在命令行中验证生成的MEX函数。
与NVIDIA的GPU万博1manbetx编码器支持包®gpu,您可以使用循环中处理器(PIL)执行来检查从MATLAB生成的CUDA代码的数值行为®功能。有关更多信息,请参见处理器在循环中从命令行执行(GPU编码器支持包的万博1manbetxNVIDIA GPU)和处理器在循环执行与GPU编码器应用(NVIDIA GPU万博1manbetx的GPU编码器支持包)。
如果你有嵌入式编码器®,您可以通过使用软件在循环(SIL)执行来验证生成的CUDA c++代码的数值行为。
在GPU编码器应用程序中,在你生成一个MEX函数后,你可以验证它与原始的MATLAB入口点函数具有相同的功能。提供一个测试文件,为被测函数生成测试向量,然后调用原始的MATLAB入口点函数。测试文件可以是MATLAB函数或脚本,但必须与原始的入口点函数在同一文件夹中。
在生成代码GPU编码器app页面,点击验证代码。
键入或选择测试文件。例如,myfunction_test
。
要运行测试文件而不将对原始MATLAB函数的调用替换为对MEX函数的调用,请选择MATLAB代码为运行使用选择。点击运行生成的代码。
要运行测试文件,将对原始MATLAB函数的调用替换为对MEX函数的调用,请选择生成的代码为运行使用选择。点击运行生成的代码。
将运行原始MATLAB函数的结果与运行生成的CUDA MEX函数的结果进行比较。
属性,可以在命令行验证生成的CUDA MEX文件coder.runTest
函数。的coder.runTest
函数通过将对原始MATLAB函数的调用替换为对MEX函数的调用来运行测试文件。例如,测试myfunction
函数与myfunction_test
测试文件,在MATLAB命令窗口中输入以下代码。
coder.runTest (“myfunction_test”,“myfunction”)
将计算结果与运行原MATLAB函数的结果进行比较。如果在运行期间发生错误,可以使用调用堆栈信息进行调试。或者,您可以使用codegen
与以及
选择。
codegen myfunction以及'myfunction_test”
测试文件可以是MATLAB函数、脚本或基于类的单元测试。
GPU编码器支持软件万博1manbetx在循环(SIL)执行,使您能够验证源代码和编译的目标代码。在通过MATLAB SIL接口执行SIL期间,软件编译并使用您提供的测试向量,在开发计算机上运行库代码。您可以重用为MATLAB函数开发的测试向量,以验证库代码的数值行为。
在微软®窗户®系统中,Windows防火墙可以潜在地阻止SIL执行。更改Windows防火墙设置以允许访问。
对于Windows平台上的SIL,建议将代码生成语言设置为c++而不是C。
在使用SIL执行时,请确保基准测试
选项在GPU编码器设置是假
。使用基准测试执行SIL会导致编译错误。
只支持静态和动态库输出类型的SIL执行。万博1manbetx如果生成了一个MEX函数,则必须更改要使用的项目设置静态库
或动态库
为构建类型和运行生成代码一次。
打开GPU编码器应用程序,在MATLAB工具条应用程序选项卡,在代码生成,点击app图标。
要打开项目,请单击,然后单击打开现有的项目
。选择项目,myproject.prj
。在生成代码页面,点击生成箭头。
在生成对话框:
集构建类型来静态库
或动态库
。
清除只生成代码复选框。
您可以将其他设置保留为默认值。
要生成CUDA c++代码,请单击生成。点击验证代码。
在命令字段中,指定测试文件(例如,myfunction_test.m
),调用原始的MATLAB函数(例如,myfunction
)。
要启动SIL执行,请单击运行生成的代码。GPU Coderapp:
中生成一个独立库codegen \ lib \ myfunction
。
中生成SIL接口代码myfunction codegen \ lib \ \硅
。
运行测试文件,将对MATLAB函数的调用替换为对库中生成的代码的调用。
显示来自SIL执行的消息测试输出选项卡。
验证SIL执行的结果是否与原始MATLAB函数的结果匹配。
要终止SIL执行过程,请单击停止SIL确认。另外,在测试输出选项卡,单击下面的链接终止执行
。
要从命令行设置并启动SIL执行,您需要为库代码生成创建一个GPU编码器配置对象,enableconfig_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架构的不同,数值验证并不总是匹配的。这个场景在使用时尤其真实单
数据类型,并对其执行累积操作单
数据类型的值。但是,在曼德尔布罗特例子中,甚至双
数据类型会导致数值错误。造成这种不匹配的一个原因是GPU的浮点单元使用了融合的浮点乘加(FMAD)指令,而CPU不使用这些指令。值得注意的是,CUDA编译器在默认情况下执行这些指令级优化会影响计算结果的准确性。例如,CUDA编译器将浮点乘法和添加指令融合到单个指令中。这种浮点乘法-加法(FMAD)操作的执行速度是两条单指令的两倍,但会导致数值精度的损失。通过使用内部函数和编译器标志,您可以对这些优化实现更严格的控制。看到GPU编码器配置属性使用编译器标记和遗留代码集成使用intrinsic。