验证生成的代码的正确性

在您生成代码后,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++代码的数值行为。

方法中验证MEX函数GPU编码器应用程序

在GPU编码器应用程序中,在你生成一个MEX函数后,你可以验证它与原始的MATLAB入口点函数具有相同的功能。提供一个测试文件,为被测函数生成测试向量,然后调用原始的MATLAB入口点函数。测试文件可以是MATLAB函数或脚本,但必须与原始的入口点函数在同一文件夹中。

  • 生成代码GPU编码器app页面,点击验证代码

  • 键入或选择测试文件。例如,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以及选择。

codegen myfunction以及'myfunction_test”

测试文件可以是MATLAB函数、脚本或基于类的单元测试。

通过软件在循环验证代码

GPU编码器支持软件万博1manbetx在循环(SIL)执行,使您能够验证源代码和编译的目标代码。在通过MATLAB SIL接口执行SIL期间,软件编译并使用您提供的测试向量,在开发计算机上运行库代码。您可以重用为MATLAB函数开发的测试向量,以验证库代码的数值行为。

请注意

  • 在微软®窗户®系统中,Windows防火墙可以潜在地阻止SIL执行。更改Windows防火墙设置以允许访问。

  • 对于Windows平台上的SIL,建议将代码生成语言设置为c++而不是C。

  • 在使用SIL执行时,请确保基准测试选项在GPU编码器设置是。使用基准测试执行SIL会导致编译错误。

的SIL执行GPU编码器应用程序

只支持静态和动态库输出类型的SIL执行。万博1manbetx如果生成了一个MEX函数,则必须更改要使用的项目设置静态库动态库构建类型和运行生成代码一次。

  1. 打开GPU编码器应用程序,在MATLAB工具条应用程序选项卡,在代码生成,点击app图标。

  2. 要打开项目,请单击,然后单击打开现有的项目。选择项目,myproject.prj。在生成代码页面,点击生成箭头

  3. 生成对话框:

    • 构建类型静态库动态库

    • 清除只生成代码复选框。

    • 您可以将其他设置保留为默认值。

  4. 要生成CUDA c++代码,请单击生成。点击验证代码

  5. 在命令字段中,指定测试文件(例如,myfunction_test.m),调用原始的MATLAB函数(例如,myfunction)。

  6. 要启动SIL执行,请单击运行生成的代码。GPU Coderapp:

    • 中生成一个独立库codegen \ lib \ myfunction

    • 中生成SIL接口代码myfunction codegen \ lib \ \硅

    • 运行测试文件,将对MATLAB函数的调用替换为对库中生成的代码的调用。

    • 显示来自SIL执行的消息测试输出选项卡。

  7. 验证SIL执行的结果是否与原始MATLAB函数的结果匹配。

  8. 要终止SIL执行过程,请单击停止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之间的数值差异

由于CPU和GPU架构的不同,数值验证并不总是匹配的。这个场景在使用时尤其真实数据类型,并对其执行累积操作数据类型的值。但是,在曼德尔布罗特例子中,甚至数据类型会导致数值错误。造成这种不匹配的一个原因是GPU的浮点单元使用了融合的浮点乘加(FMAD)指令,而CPU不使用这些指令。值得注意的是,CUDA编译器在默认情况下执行这些指令级优化会影响计算结果的准确性。例如,CUDA编译器将浮点乘法和添加指令融合到单个指令中。这种浮点乘法-加法(FMAD)操作的执行速度是两条单指令的两倍,但会导致数值精度的损失。通过使用内部函数和编译器标志,您可以对这些优化实现更严格的控制。看到GPU编码器配置属性使用编译器标记和遗留代码集成使用intrinsic。