主要内容

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

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

学习目标

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

  • 使用使用的准备您的MATLAB代码进行CUDA代码生成kernelfun编译指示。

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

  • 定义函数输入属性。

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

  • 指定代码生成属性。

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

教程的先决条件

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

  • MATLAB

  • MATLAB编码器™

  • GPU编码器

  • c++编译器

  • 英伟达®GPU为CUDA启用了

  • CUDA工具包和驱动程序

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

示例:Mandelbrot Set

描述

曼德尔勃洛特集是复平面中由这些值组成的区域z0由这个方程定义的轨迹是有界的k→∞

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

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

Mandelbrot Set的几何形状

算法

对于本教程,选择一组限制,指定在主心脏线和之间的谷中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集合的彩色编码图。在本教程的后面,您将修改该文件以使其适合于代码生成。

功能数= mandelbrot_count (maxIterations xGrid yGrid)曼德布洛特百分比计算z0 = Xgrid + 1i * ygrid;count = =(尺寸(z0));z = z0;n = 0:maxIterations z = z。* z + z0;内部= abs(z)<= 2;count =内部计数+;结束数=日志(数);

创建一个名为matlab脚本mandelbrot_test.m用下面的代码行。该脚本生成一个由实际部件组成的1000 × 1000网格(x)和虚部(y)之间的界限xlimylim.它还称之为mandelbrot_count函数并绘制得到的Mandelbrot集合。

maxIterations = 500;gridSize = 1000;xlim = [-0.748766713922161, -0.748766707771757];ylim = [0.123640844894862, 0.123640851045266];xlim x = linspace (xlim (1), (2), gridSize);ylim y = linspace (ylim (1), (2), gridSize);[xGrid, yGrid] = meshgrid (x, y);%% Mandelbrot计算在MATLABcount = mandelbrot_count(maxIrtations,Xgrid,Ygrid);%显示图(1)ImageC(x,y,count);Colormap([Jet(); Flipud(Jet()); 0 0 0]);轴离开标题(曼德尔勃洛特集与MATLAB);

运行原MATLAB代码

运行Mandelbrot示例

在制作适用于代码生成的MADELBROT集合算法的MATLAB版本之前,您可以测试原始代码的功能。

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

  2. 运行mandelbrot_test脚本。

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

曼德尔勃洛特集的MATLAB绘图

准备MATLAB代码生成的代码

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

检查设计时间的问题

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

  • 代码分析工具

  • 代码生成准备工具

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

请注意

代码分析器不会检测到所有代码生成问题。消除了代码分析仪检测到的错误或警告后,使用GPU编码器编译代码以确定代码是否具有其他合规性问题。

代码生成准备工具屏幕屏幕用于代码生成不支持的功能和功能的MATLAB代码。金宝app此工具提供了一个报告,列出了制作适用于代码生成的MATLAB代码的问题和建议。您可以通过以下方式访问代码生成准备工具:

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

  • 在命令行 - 通过使用coder.screener函数与-GPU.国旗。

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

检查代码生成时间的问题

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

制作MATLAB适合代码生成的代码

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

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

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

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

    功能数= mandelbrot_count (maxIterations xGrid yGrid)%#codegen.

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

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

    功能数= mandelbrot_count (maxIterations xGrid yGrid)%#codegen.添加kernelfun命令来触发内核创建coder.gpu.kernelfun;曼德布洛特百分比计算z0 = Xgrid + 1i * ygrid;count = =(尺寸(z0));z = z0;n = 0:maxIterations z = z。* z + z0;内部= abs(z)<= 2;count =内部计数+;结束数=日志(数);

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

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

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

打开GPU编码器应用程序

基于MATLAB的工具条应用程序选项卡,在代码生成,单击GPU编码器应用图标。你也可以通过输入来打开应用程序gpucoder在MATLAB命令窗口中。应用程序打开选择源文件页面。

选择源文件

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

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

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

定义输入类型

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

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

  • 直接输入输入类型。

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

在此示例中,要定义输入的属性maxIterationsXgrid., 和ygrid.,指定测试文件mandelbrot_test.m

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

  2. 点击自动杂记输入类型

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

    定义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 Toolchain,只要环境变量设置正确。

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

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

  3. 点击产生

    GPU编码器生成MEX可执行文件mandelbrot_count_mex在您的工作文件夹中。的< pwd > \ codegen \墨西哥人\ mandelbrot_count文件夹包含包含CUDA源(* .cu)和标题文件的所有其他生成文件。GPU编码器应用程序表示代码生成成功。它显示源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.变量,它包含有关线程和块大小、共享内存和常量内存使用情况以及每个内核的输入和输出参数的信息。的cudaMalloccudaMemcpy变量包含关于所有GPU变量的大小和数量的信息memcpy主机和设备之间的调用。

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

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

查看完成工作流程页面

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

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

验证生成的代码的正确性

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

另请参阅

应用程序

功能

对象

相关话题