Main Content

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

创建CUDA的最简单方法®内核要放置coder.gpu.kernelfun巴格马进入你的基本的MATLAB®功能。主要功能也称为顶层或者入口点功能。当GPU Coder™遇到内尔富恩PRAGMA,它试图并行化此函数中的所有计算,然后将其映射到GPU。有关GPU内核的更多信息,请参阅GPU编程范式

学习目标

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

  • 通过使用内尔富恩巴格马。

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

  • 定义函数输入属性。

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

  • 指定代码生成属性。

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

教程先决条件

本教程需要以下产品:s manbetx 845

  • MATLAB

  • MATLAB CODER™

  • GPU编码器

  • C ++编译器

  • nvidia®启用了cuda的GPU

  • CUDA工具包和驱动程序

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

示例:Mandelbrot集

描述

mandelbrot集是由值组成的复杂平面中的区域z0该方程定义的轨迹在其上保持一致K→∞

z k + 1 = z k 2 + z 0 ,,,, k = 0 ,,,, 1 ,,,,

这overall geometry of the Mandelbrot set is shown in the figure. This view does not have the resolution to show the richly detailed structure of the fringe just outside the boundary of the set. At increasing magnifications, the Mandelbrot set exhibits an elaborate boundary that reveals progressively finer recursive detail.

Mandelbrot集的几何形状

算法

在本教程中,选择一组限制,这些限制指定了主心脏和主体之间的山谷中的曼德布罗特的高度缩放部分P/Qbulb to its left. A 1000-by-1000 grid of real parts (X)和虚构的部分(y)在这两个限制之间创建。然后在每个网格位置迭代Mandelbrot算法。500的迭代编号可完整分辨率。

最大值= 500;网格= 1000;xlim = [-0.748766713922161,-0.74876670777757];ylim = [0.123640844894862,0.123640851045266];

This tutorial uses an implementation of the Mandelbrot set by using standard MATLAB commands running on the CPU. This calculation is vectorized such that every location is updated simultaneously.

教程文件

创建一个称为MATLAB功能mandelbrot_count.m带有以下代码行。该代码是Mandelbrot集的基线矢量化MATLAB实现。每一点(XGRID,YGRID)在网格中,它计算迭代索引数数方程定义的轨迹达到的轨迹达到2来自原产地。然后它返回自然对数数数,用于生成Mandelbrot集的颜色编码图。在本教程的稍后,您可以修改此文件以使其适合代码生成。

功能count = mandelbrot_count(MaxIterations,Xgrid,Ygrid)%mandelbrot计算Z0 = XGRID + 1i*ygrid;count =一个(size(z0));z = z0;为了n = 0:maxiterations z = z。*z + z0;内部= abs(z)<= 2;count = count +内部;结尾count = log(count);

创建一个称为MATLAB脚本mandelbrot_test.m带有以下代码行。该脚本生成1000 x-1000的真实零件网格(X)和虚构的部分(y)在指定的限制之间xlimYlim。它还称mandelbrot_count功能和plots the resulting Mandelbrot set.

最大值= 500;网格= 1000;xlim = [-0.748766713922161,-0.74876670777757];ylim = [0.123640844894862,0.123640851045266];x = linspace(xlim(1),xlim(2),栅格);y = linspace(Ylim(1),Ylim(2),Gridsize);[XGRID,YGRID] = MESHGRID(X,Y);MATLAB中的Mandelbrot计算count = mandelbrot_count(MaxIterations,Xgrid,Ygrid);% 节目图(1)imagesc(x,y,count);colormap([JET(); flipud(Jet()); 0 0 0]);轴离开标题(“带有matlab的mandelbrot”);

运行原始MATLAB代码

跑过Mandelbrot Example

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

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

  2. 跑过mandelbrot_test脚本。

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

MATLAB中的Mandelbrot的图

准备MATLAB代码生成代码

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

在设计时检查问题

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

  • 代码Analyzer tool

  • 代码生成准备工具

这代码Analyzer is a tool incorporated into the MATLAB Editor that continuously checks your code as you enter it. The Code Analyzer reports issues and recommends modifications to maximize performance and maintainability of your code. To identify the warnings and errors specific to code generation from your MATLAB code, add the%#codegen您的MATLAB文件指令。有关更多信息,请参阅代码分析仪首选项

笔记

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

代码生成准备工具筛选了MATLAB代码的功能和功能,这些功能不支持代码生成。万博1manbetx该工具提供了一份报告,该报告列出了使MATLAB代码适合代码生成的问题和建议。您可以以这些方式访问代码生成准备工具:

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

  • 在命令行 - 使用编码器。Screener功能with the-gpuflag.

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

在代码生成时间检查问题

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

MATLAB适用于代码生成的代码

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

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

  2. 在里面MATLABEditor, openmandelbrot_count.m。MATLAB编辑器右上角的代码分析仪消息指示器是绿色的。该分析仪未检测到该法规改进的错误,警告或机会。

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

    功能count = mandelbrot_count(MaxIterations,Xgrid,Ygrid)%#codegen

    代码分析仪消息指标保持绿色,表明它没有检测到任何代码生成问题。

  4. 映射mandelbrot_count功能到CUDA内核,通过放置原始MATLAB代码来修改原始MATLAB代码coder.gpu.kernelfunpragma in the body of the function.

    功能count = mandelbrot_count(MaxIterations,Xgrid,Ygrid)%#codegen%添加kernelfun pragma触发内核创建coder.gpu.kernelfun;%mandelbrot计算Z0 = XGRID + 1i*ygrid;count =一个(size(z0));z = z0;为了n = 0:maxiterations z = z。*z + z0;内部= abs(z)<= 2;count = count +内部;结尾count = log(count);

    如果您使用coder.gpu.kernelfunpragma, GPU Coder attempts to map the computations in the functionmandelbrot_count到GPU。

  5. Save the file. You are now ready to compile your code by using the GPU Coder app.

通过使用GPU编码器应用程序

打开GPU编码器应用程序

在MATLAB工具条上应用标签,下代码生成,,,,click the GPU Coder app icon. You can also open the app by typingGPUCODER在MATLAB命令窗口中。该应用程序打开选择源文件页面。

选择源文件

  1. 选择source files page, enter or select the name of the基本的功能,mandelbrot_count。主要功能也称为顶层或者入口点功能。该应用程序创建一个带有默认名称的项目mandelbrot_count.prj在当前文件夹中。

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

  2. 点击下一个和去Define Input Types步。这app analyzes the function for coding issues and code generation readiness. If the app identifies issues, it opens the审查代码生成准备就绪您可以在其中查看和解决问题的页面。在此示例中,由于该应用没有检测到问题,因此它打开了Define Input Types页。

Define Input Types

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

  • Provide a test file that calls the project entry-point functions. The GPU Coder app can infer the input argument types by running the test file.

  • 直接输入输入类型。

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

在此示例中,定义输入的属性最大值,,,,XGRID, 和ygrid,指定测试文件mandelbrot_test.m

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

  2. 点击Autodefine输入类型

    这test filemandelbrot_test.m调用入口点函数,mandelbrot_count.m具有预期的输入类型。应用程序注入输入最大值双(1x1)和输入XGRIDygrid双(1000x1000)

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

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

检查运行时间问题

检查运行时间问题步骤从您的入口点功能中生成MEX文件,运行MEX函数并报告问题。此步骤是可选的。但是,执行此步骤是最好的做法。使用此步骤,您可以检测和修复在生成的GPU代码中更难诊断的缺陷。

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

  • 检查寄存器溢出。

  • 堆栈尺寸一致性检查。

笔记

您的代码中可能有某些MATLAB构造引起检查运行时间问题为了使CPU特定的检查失败,但通过了特定于GPU的检查。

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

  2. 在里面检查运行时间问题dialog box, specify a test file or enter code that calls the entry-point function with example inputs. For this example, use the test filemandelbrot_test.m您用来定义输入类型。

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

    该应用程序生成MEX函数。它运行测试脚本mandelbrot_test更换电话mandelbrot_count带有发电的MEX的电话。如果该应用在MEX功能生成或执行过程中检测到问题,则提供警告和错误消息。您可以单击这些消息以导航到有问题的代码并解决问题。在此示例中,该应用程序未检测到问题。MEX功能具有与原始功能相同的功能mandelbrot_count功能。

    Check for run-time issues window of the GPU Coder app

    笔记

    您的代码中可能有某些MATLAB构造引起检查运行时间问题为了使CPU特定的检查失败,但通过了特定于GPU的检查。

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

产生库达代码

  1. 打开产生对话框,单击产生箭。

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

  2. 在里面产生对话框,您可以选择要GPU编码器执行的构建类型。可用选项在此表中列出。

    构建类型 描述
    源代码

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

    梅克斯

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

    静态库

    Binary library for static linking with an external project.

    动态库

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

    可执行

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

    对于本教程,设置构建类型MEX(.mex)。通过生成MEX输出,您可以从MATLAB内检查生成的CUDA代码的正确性。MEX构建类型不需要其他设置工具链硬件板。它还不提供仅生成源代码的选项。GPU编码器可以自动选择可用的CUDA工具链环境变量设置正确。

    要查看高级选项,请选择更多设置 - > GPU代码。到编译器标志选项,添加-fmad = false。This flag, when passed to theNVCC,指示编译器禁用浮点多元ADD(FMAD)优化。由于CPU和GPU之间的架构差异,因此设置了此选项以防止生成代码中的数值不匹配。有关更多信息,请参阅CPU和GPU之间的数值差异

    GPU编码器的特定设置窗口

  3. 点击产生

    GPU编码器生成MEX可执行文件mandelbrot_count_mex在您的工作文件夹中。这\codegen\mex\mandelbrot_count文件夹包含所有其他生成的文件,包括CUDA源(*.cu)和标头文件。GPU编码器应用程序表示代码生成成功。它显示页面左侧的源Matlab文件和生成的输出文件。在Variables选项卡,它显示有关MATLAB源变量的信息。在Target Build Log选项卡,它显示构建日志,包括编译器警告和错误。默认情况下,在代码窗口中,该应用显示CUDA源文件mandelbrot_count.cu。要查看其他文件,在源代码或者输出文件窗格,单击文件名。

    应用程序window showing successful MEX code generation

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

    代码生成报告窗口

    GPUKernels关于生成的代码TAB提供了在GPU代码生成期间创建的内核列表。此列表中的项目链接到相关源代码。例如,当您单击时mandelbrot_count_kernel1,此内核的代码部分显示在代码浏览器窗口中。

    查看报告后,您可以关闭代码生成报告窗户。要稍后查看报告,请打开report.mldatx\codegen\mex\mandelbrot_cout\html文件夹。

  5. \codegen\mex\mandelbrot_count包含gpu_codegen_info.mat包含生成的GPU代码的统计信息的MAT文件。这个垫子包含cuda_kernelvariable that has information about the thread and block sizes, shared and constant memory usage, and input and output arguments of each kernel. ThecudaMalloccudamcpyvariables contain information about the size of all the GPU variables and the number ofmemcpy主机和设备之间的呼叫。

    包含代码生成信息的Mat-File内容的屏幕截图

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

查看完成工作流页面

完成工作流程页面显示代码生成成功。It provides a project summary and links to the MATLAB source files, the code generation report, and the generated output binaries. You can save the configuration parameters of the current GPU Coder project as a MATLAB script. See将MATLAB编码器项目转换为MATLAB脚本

Finish workflow window of the app

验证生成代码的正确性

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

也可以看看

应用

功能

对象

相关话题