主要内容

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

创建CUDA最简单的方法®果仁是用来放置coder.gpu.kernelfun.编译指示到你基本的马铃薯草®函数。主要功能也称为顶级入口点函数。当GPU编码器™遇到kernelfunpragma,它尝试并行化这个函数中的所有计算,然后将它映射到GPU。有关GPU内核的更多信息,请参见GPU编程范式

学习目标

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

  • 为CUDA代码生成准备您的MATLAB代码使用kernelfunpragma。

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

  • 定义函数输入属性。

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

  • 指定代码生成属性。

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

教程先决条件

本教程需要以下产品:下载188bet金宝搏

  • 马铃薯草

  • MATLAB编码器™

  • GPU编码器

  • c++编译器

  • 英伟达®GPU支持CUDA

  • CUDA工具包和驱动程序

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

例如:Mandelbrot集合

描述

Mandelbrot Set是由值组成的复平面中的区域z0由这个方程定义的轨迹是有界的k→∞

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

Mandelbrot集合的整体几何结构如图所示。这个观点没有分辨率显示丰富详细的结构边缘的边界以外的集合。在不断放大的情况下,Mandelbrot集合展示了一个复杂的边界,揭示了越来越精细的递归细节。

Mandelbrot Set的几何形状

算法

对于本教程,请选择一组限制,该限制指定在主心形和主题之间的谷的高度缩放部分的曼德布略的部分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(maxIlerations,Xgrid,Ygrid)曼德布洛特百分比计算z0 = xGrid + 1i*yGrid;数= 1(大小(z0));z = z0;n = 0:maxIterations z = z.*z + z0;在= abs (z) < = 2;Count = Count +内部;结束count = log(count);

创建一个MATLAB脚本调用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),网格化);y = linspace(ylim(1),ylim(2),gridsize);[xGrid,ygrid] = meshgrid(x,y);%% Mandelbrot计算在MATLAB数= mandelbrot_count (maxIterations xGrid yGrid);% 展示图(1)ImageC(x,y,count);Colormap([Jet(); Flipud(Jet()); 0 0 0]);轴标题(曼德尔勃洛特集与MATLAB);

运行原马铃薯草代码

运行Mandelbrot示例

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

  1. 将当前的MATLAB工作文件夹更改为包含mandelbrot_count.m.mandelbrot_test.m..GPU编码器将生成的代码放在此文件夹中。如果没有完全访问此文件夹,请更改当前的工作文件夹。

  2. 跑过mandelbrot_test脚本。

测试脚本运行并显示由变量设置的边界内的Mandelbrot的几何形状XLIM.ylim.

在Matlab中设置的曼德尔特策划

准备马铃薯草代码生成的代码

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

在设计时检查问题

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

  • 代码分析工具

  • 代码生成准备工具

代码分析器是一个集成到MATLAB编辑器中的工具,当您输入代码时,它会不断地检查代码。代码分析器报告问题并建议进行修改,以最大化代码的性能和可维护性。要识别特定于从MATLAB代码生成的代码的警告和错误,请添加% # codegen指令到MATLAB文件中。有关更多信息,请参见代码分析器的偏好

请注意

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

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

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

  • 在命令行-通过使用编码器.Screener.函数与gpu国旗。

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

在代码生成时检查问题

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

使马铃薯草适合代码生成的代码

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

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

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

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

    函数count = mandelbrot_count(maxIlerations,Xgrid,Ygrid)% # codegen

    代码分析仪消息指示符保持绿色,表示它尚未检测到任何代码生成问题。

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

    函数count = mandelbrot_count(maxIlerations,Xgrid,Ygrid)% # codegen%添加Kernelfun Pragma触发内核创建coder.gpu.kernelfun;曼德布洛特百分比计算z0 = xGrid + 1i*yGrid;数= 1(大小(z0));z = z0;n = 0:maxIterations z = z.*z + z0;在= abs (z) < = 2;Count = Count +内部;结束count = log(count);

    如果你使用coder.gpu.kernelfun.pragma, GPU编码器尝试映射函数中的计算mandelbrot_count.到GPU。

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

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

打开GPU编码器应用程序

在Matlab Toolstrip上应用选项卡,在代码生成,单击GPU编码器应用图标。你也可以通过输入来打开应用程序GPUCODER.在MATLAB命令窗口中。应用程序打开选择源文件页面。

选择源文件

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

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

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

定义输入类型

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

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

  • 直接输入输入类型。

有关输入规范的更多信息,请参见输入规格

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

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

  2. 点击Autodefine输入类型

    测试文件mandelbrot_test.m.调用入口点函数,mandelbrot_count.m.使用期望的输入类型。应用程序推断输入maxIterations双(1 x1)和输入xGridyGrid双(1000 x1000)

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

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

检查运行时问题

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

GPU编码器提供此时执行GPU特定检查的选项。选择此选项时,GPU编码器从您的入口点函数生成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编码器应用程序的代码窗口

  2. 生成对话框中,您可以选择希望GPU编码器执行的构建类型。可用选项列在该表中。

    构建类型 描述
    源代码

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

    墨西哥人

    编译的代码运行在MATLAB内部。

    静态库

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

    动态库

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

    可执行文件

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

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

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

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

  3. 点击生成

    GPU编码器生成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.,该内核的代码部分显示在代码浏览器窗口中。

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

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

    包含代码生成信息的MAT文件内容的屏幕截图

  6. 2 .在GPU编码器应用中,单击下一个打开完成工作流程页面。

检查完成工作流页面

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

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

验证生成代码的正确性

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

另请参阅

应用

功能

对象

相关的话题