主要内容

代码生成使用GPU编码器应用程序

创建CUDA最简单的方法®果仁是放置的coder.gpu.kernelfunPragma进入你的主要的MATLAB®函数。主函数也称为顶级入口点函数。当GPU Coder™遇到kernelfunpragma,它尝试在这个函数中并行所有的计算,然后将其映射到GPU。有关GPU内核的更多信息,请参见GPU编程范式

学习目标

在本教程中,您将学习如何:

  • 为CUDA代码生成准备MATLAB代码kernelfun编译指示。

  • 创建并设置一个GPU编码器项目。

  • 定义函数输入属性。

  • 检查代码生成准备情况和运行时问题。

  • 指定代码生成属性。

  • 通过使用GPU编码器应用程序生成CUDA代码。

教程的先决条件

本教程需要以下产品:2022世界杯八强谁会赢?

  • MATLAB

  • MATLAB编码器™

  • GPU编码器

  • c++编译器

  • 英伟达®CUDA启用GPU

  • CUDA工具包和驱动程序

  • 编译器和库的环境变量。有关更多信息,请参见环境变量

示例:Mandelbrot集合

描述

曼德尔布罗特集是复平面上由这些值组成的区域z0由这个方程定义的轨迹在k→∞

z k + 1 z k 2 + z 0 k 0 1 ...

Mandelbrot集合的整体几何如图所示。这个视图没有分辨率来显示集合边界外丰富的细节结构的边缘。在不断放大的情况下,曼德尔布罗特集显示出一个复杂的边界,逐步揭示更精细的递归细节。

Mandelbrot集合的几何

算法

在本教程中,选择一组限制,该限制指定Mandelbrot集中在主心脏线和p / q它左边的灯泡。由实部组成的1000 * 1000网格(x)和虚部(y)是在这两个极限之间产生的。然后在每个网格位置迭代Mandelbrot算法。迭代次数为500以全分辨率呈现图像。

maxIterations = 500;gridSize = 1000;Xlim = [-0.748766713922161,-0.748766707771757];Ylim = [0.123640844894862,0.123640851045266];

本教程使用在CPU上运行的标准MATLAB命令来实现Mandelbrot集。这个计算是向量化的,这样每个位置都会同时更新。

教程文件

创建一个MATLAB函数叫做mandelbrot_count.m使用下面的代码行。此代码是Mandelbrot集的基线向量化MATLAB实现。对于每一点(xGrid yGrid)在网格中,它计算迭代索引在此点,由方程定义的轨迹达到的距离2从原点开始。然后返回的自然对数,用于生成Mandelbrot集的彩色编码图。在本教程的后面部分,您将修改该文件,使其适合代码生成。

函数count = mandelbrot_count(maxIterations,xGrid,yGrid)% mandelbrot计算z0 = xGrid + 1i*yGrid;Count = ones(size(z0));Z = z0;n = 0:maxIterations z = z.*z + z0;Inside = abs(z)<=2;计数=计数+内部;结束Count = log(Count);

创建一个名为mandelbrot_test.m使用下面的代码行。该脚本生成一个由实际部件组成的1000 * 1000网格(x)和虚部(y)所指明的极限之间xlim而且ylim.它还调用mandelbrot_count函数并绘制得到的Mandelbrot集。

maxIterations = 500;gridSize = 1000;Xlim = [-0.748766713922161,-0.748766707771757];Ylim = [0.123640844894862,0.123640851045266];x = linspace(xlim(1),xlim(2),gridSize);y = linspace(ylim(1),ylim(2),gridSize);[xGrid,yGrid] = meshgrid(x,y);%% Mandelbrot计算MATLABcount = mandelbrot_count(maxIterations,xGrid,yGrid);%显示图(1)显示亮度图像(x, y,数);Colormap ([jet();flipud(jet());0 0 0]);轴标题(MATLAB中的Mandelbrot集);

运行原版本MATLAB代码

运行Mandelbrot示例

在使MATLAB版本的Mandelbrot集算法适合代码生成之前,您可以测试原始代码的功能。

  1. 将当前MATLAB工作文件夹更改为包含的位置mandelbrot_count.m而且mandelbrot_test.m.GPU编码器将生成的代码放在这个文件夹中。如果您没有对当前工作文件夹的完全访问权限,请更改该文件夹。

  2. 运行mandelbrot_test脚本。

测试脚本运行并在变量设置的边界内显示Mandelbrot的几何形状xlim而且ylim

MATLAB中Mandelbrot集的图

准备MATLAB用于代码生成的代码

在使用GPU Coder生成代码之前,请检查原始MATLAB代码中的编码问题。

在设计时检查问题

有两个工具可以帮助您在设计时检测代码生成问题:

  • 代码分析器工具

  • 代码生成准备工具

代码分析器是一个集成到MATLAB编辑器中的工具,它在您输入代码时连续检查您的代码。代码分析器报告问题并建议修改,以最大限度地提高代码的性能和可维护性。若要识别特定于从MATLAB代码生成的代码的警告和错误,请添加% # codegen指令到你的MATLAB文件。有关更多信息,请参见代码分析器首选项

请注意

代码分析器不检测所有代码生成问题。在消除代码分析器检测到的错误或警告后,使用GPU Coder编译代码,以确定代码是否有其他遵从性问题。

代码生成准备工具会筛选MATLAB代码中不支持代码生成的特性和功能。这个工具提供了一个报告,列出了使MATLAB代码适合代码生成的问题和建议。您可以通过以下方式访问代码生成准备工具:

  • 在当前文件夹浏览器中-右键单击包含入口点函数的MATLAB文件。

  • 在命令行中—通过使用coder.screener函数与gpu国旗。

  • 在GPU Coder应用程序中-在指定入口点文件后,应用程序运行代码分析器和代码生成准备工具。

在代码生成时检查问题

您可以使用GPU编码器在代码生成时检查问题。当GPU Coder检测到错误或警告时,它会生成一个错误报告,描述问题并提供有问题的MATLAB代码的链接。有关更多信息,请参见代码生成报告

使MATLAB适合代码生成的代码

要开始使您的MATLAB代码适合代码生成的过程,请使用该文件mandelbrot_count.m

  1. 将MATLAB当前文件夹设置为包含本教程文件的工作文件夹。

  2. 在MATLAB编辑器中,打开mandelbrot_count.m.MATLAB编辑器右上角的代码分析器消息指示器是绿色的。分析器没有检测到代码中的错误、警告或改进机会。

  3. 函数声明之后,添加% # codegen指示打开特定于代码生成的错误检查。

    函数count = mandelbrot_count(maxIterations,xGrid,yGrid)% # codegen

    Code Analyzer消息指示器保持绿色,表示它没有检测到任何代码生成问题。

  4. 绘制mandelbrot_count函数到CUDA内核,修改原始MATLAB代码通过放置coder.gpu.kernelfun函数体中的Pragma。

    函数count = mandelbrot_count(maxIterations,xGrid,yGrid)% # codegen添加kernelfun pragma来触发内核创建coder.gpu.kernelfun;% mandelbrot计算z0 = xGrid + 1i*yGrid;Count = ones(size(z0));Z = z0;n = 0:maxIterations z = z.*z + z0;Inside = abs(z)<=2;计数=计数+内部;结束Count = log(Count);

    如果你使用coder.gpu.kernelfunpragma, GPU Coder尝试映射函数中的计算mandelbrot_count到GPU。

  5. 保存文件。现在,您可以使用GPU Coder应用程序编译代码了。

方法生成代码GPU编码器应用程序

打开GPU编码器应用程序

在MATLAB工具条上应用程序选项卡,在代码生成,单击GPU Coder应用程序图标。你也可以通过打字打开应用程序gpucoder在MATLAB命令窗口中。应用程序打开选择源文件页面。

选择源文件

  1. 选择源文件页中,输入或选择的名称主要的函数,mandelbrot_count.主函数也称为顶级入口点函数。应用程序用默认名称创建一个项目mandelbrot_count.prj在当前文件夹中。

    选择源文件窗口的GPU编码器应用程序

  2. 点击下一个然后去定义输入类型的一步。该应用程序分析了编码问题和代码生成准备的功能。如果应用程序发现问题,它会打开检查代码生成准备情况页,您可以在此查看和修复问题。在本例中,因为应用程序没有检测到问题,所以它会打开定义输入类型页面。

定义输入类型

代码生成器必须在编译时确定MATLAB文件中所有变量的数据类型。因此,必须指定所有输入变量的数据类型。您可以通过以下两种方式之一指定输入数据类型:

  • 提供一个调用项目入口点函数的测试文件。GPU Coder应用程序可以通过运行测试文件推断输入参数类型。

  • 直接输入输入类型。

有关输入规范的详细信息,请参见输入规格

在本例中,定义输入的属性maxIterationsxGrid,yGrid,指定测试文件mandelbrot_test.m

  1. 输入或选择测试文件mandelbrot_test.m

  2. 点击自动定义输入类型

    测试文件mandelbrot_test.m调用入口点函数,mandelbrot_count.m使用预期的输入类型。应用程序推断输入maxIterations双(1 x1)以及输入xGrid而且yGrid双(1000 x1000)

    定义输入类型窗口的GPU编码器应用程序

  3. 点击下一个检查运行时问题的一步。

检查运行时问题

检查运行时问题步骤从入口点函数生成一个MEX文件,运行MEX函数,并报告问题。该步骤是可选的。但是,执行此步骤是最佳实践。使用此步骤,您可以检测和修复生成的GPU代码中难以诊断的缺陷。

GPU Coder提供了在此时执行特定于GPU的检查的选项。当您选择此选项时,GPU Coder将从您的入口点函数生成CUDA代码和MEX文件,运行MEX函数并报告问题。一些特定于gpu的运行时检查包括:

  • 检查寄存器溢出。

  • 堆栈大小一致性检查。

请注意

代码中可能有某些MATLAB结构会导致检查运行时问题通过特定于cpu的检查,但通过特定于gpu的检查。

  1. 打开检查运行时问题对话框中,单击检查问题箭头。

  2. 检查运行时问题对话框中,指定测试文件或输入代码,使用示例输入调用入口点函数。对于本例,使用测试文件mandelbrot_test.m用来定义输入类型的。

  3. 要启用特定于gpu的检查,请选择GPU选项按钮。点击检查问题

    应用程序生成一个MEX函数。它运行测试脚本mandelbrot_test替换对mandelbrot_count调用生成的MEX。如果应用程序在生成或执行MEX函数期间检测到问题,它会提供警告和错误消息。您可以单击这些消息导航到有问题的代码并修复问题。在本例中,应用程序没有检测到问题。MEX功能与原有功能相同mandelbrot_count函数。

    检查GPU编码器应用程序的运行时问题窗口

    请注意

    代码中可能有某些MATLAB结构会导致检查运行时问题通过特定于cpu的检查,但通过特定于gpu的检查。

  4. 点击下一个生成代码的一步。

生成CUDA代码

  1. 打开生成对话框中,单击生成箭头。

    生成GPU Coder应用程序的代码窗口

  2. 生成对话框中,您可以选择要GPU Coder执行的构建类型。该表中列出了可用的选项。

    构建类型 描述
    源代码

    与外部项目集成的CUDA源代码。

    墨西哥人

    编译代码在MATLAB中运行。

    静态库

    用于与外部项目进行静态链接的二进制库。

    动态库

    用于与外部项目动态链接的二进制库。

    可执行的

    独立程序(需要自定义CUDA主文件)。

    对于本教程,设置构建类型墨西哥人(.mex).通过生成MEX输出,您可以在MATLAB中检查生成的CUDA代码的正确性。MEX构建类型不需要像工具链而且硬件板.它也没有提供只生成源代码的选项。GPU编码器可以自动选择一个可用的CUDA工具链,只要环境变量设置正确。

    单击,查看高级选项更多设置- > GPU代码.到编译器标志选项,添加——fmad = false.此标志,当传递给学校网站,指示编译器禁用浮点乘法-添加(FMAD)优化。设置此选项是为了防止由于CPU和GPU之间的架构差异而导致生成代码中的数值不匹配。有关更多信息,请参见CPU和GPU的数值差异

    GPU编码器特定的设置窗口的应用程序

  3. 点击生成

    GPU Coder生成MEX可执行文件mandelbrot_count_mex在你的工作文件夹中。的< pwd > \ codegen \墨西哥人\ mandelbrot_count文件夹包含所有其他生成的文件,包括CUDA源文件(*.cu)和头文件。“GPU Coder”应用提示代码生成成功。它在页面左侧显示MATLAB源文件和生成的输出文件。在变量选项卡,显示MATLAB源变量信息。在目标生成日志选项卡,它显示生成日志,包括编译器警告和错误。默认情况下,在代码窗口中,应用程序显示CUDA源文件mandelbrot_count.cu.要查看不同的文件,请在源代码输出文件窗格中,单击文件名。

    应用程序窗口显示成功的MEX代码生成

  4. 单击,查看代码生成报告查看报告.该报告提供了到MATLAB代码和生成的CUDA (*.cu)文件的链接。它还为MATLAB代码中的变量和表达式提供编译时信息。这些信息帮助您找到错误和警告的来源。它还可以帮助您调试代码中的代码生成问题。有关更多信息,请参见代码生成报告

    代码生成报告窗口

    GPU内核章节生成的代码选项卡提供了GPU代码生成过程中创建的内核列表。此列表中的项目链接到相关源代码。例如,当你点击mandelbrot_count_kernel1,此内核的代码部分显示在代码浏览器窗口中。

    查看报告后,可以关闭代码生成报告窗口。稍后要查看报告,请打开report.mldatx< pwd > \ codegen \墨西哥人\ mandelbrot_cout \ html文件夹中。

  5. < pwd > \ codegen \墨西哥人\ mandelbrot_count包含了gpu_codegen_info.matmat -文件,包含生成的GPU代码的统计信息。这个mat文件包含cuda_Kernel变量,该变量包含有关线程和块大小、共享和常量内存使用情况以及每个内核的输入和输出参数的信息。的cudaMalloc而且cudaMemcpy变量包含关于所有GPU变量的大小和数量的信息memcpy主机与设备之间的通话。

    包含代码生成信息的mat文件内容的截图

  6. 在“GPU Coder”应用中,单击下一个打开完成工作流程页面。

检查完成工作流页面

完成工作流程Page表示代码生成成功。它提供了一个项目摘要,并链接到MATLAB源文件、代码生成报告和生成的输出二进制文件。您可以将当前GPU Coder项目的配置参数保存为MATLAB脚本。看到转换MATLAB编码器项目到MATLAB脚本

完成应用程序的工作流窗口

验证生成的代码的正确性

验证生成的MEX文件是否正确,请参见验证生成的代码的正确性

另请参阅

应用程序

功能

对象

相关的话题

Baidu
map