主要内容

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

最简单的方法创建CUDA®内核是地方coder.gpu.kernelfun编译指示到你MATLAB®函数。主函数也称为顶级入口点函数。当GPU编码器™遇到kernelfun编译指示,它试图并行化计算在这个函数,然后将它映射到GPU。关于GPU内核的更多信息,请参阅GPU编程范式

学习目标

在本教程中,您将了解如何:

  • 准备CUDA MATLAB代码通过使用生成代码kernelfun编译指示。

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

  • 定义函数输入属性。

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

  • 指定代码生成属性。

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

教程的先决条件

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

  • MATLAB

  • MATLAB编码器™

  • GPU编码器

  • c++编译器

  • 英伟达®CUDA GPU支持

  • CUDA工具包和司机

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

例子:了曼德尔勃特集合

描述

了曼德尔勃特集合中该地区复平面组成的值z0的定义的轨迹方程仍然有限k→∞

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

曼德尔勃特集合的整体几何图所示。这种观点没有边缘的分辨率显示丰富详细的结构的边界外。在不断的放大,一个精心设计的边界,揭示了曼德尔勃特集合展品逐步精细递归的细节。

曼德尔勃特集合的几何

算法

对于本教程,选择一组限制,指定一个高度放大了曼德尔勃特集合的一部分主心形和之间的山谷p / q灯泡了。1000 - 1000年电网的实际部分(x)和虚部(y这两个极限之间创建)。曼德布洛特然后在每个迭代算法网格的位置。迭代500全部呈现图像分辨率。

maxIterations = 500;gridSize = 1000;xlim = [-0.748766713922161, -0.748766707771757];ylim = [0.123640844894862, 0.123640851045266];

本教程使用了曼德尔勃特集合的实现通过使用标准的MATLAB命令在CPU上运行。这个计算是每个位置矢量化,同时更新。

教程文件

创建一个调用MATLAB函数mandelbrot_count.m用下面的代码行。这段代码是一个基线矢量化的MATLAB实现了曼德尔勃特集合,每一个点(xGrid yGrid)在网格,计算迭代索引在定义的轨迹方程达到的距离2从原点。然后它返回的自然对数,生成的颜色编码的阴谋了曼德尔勃特集合。后来在本教程中,您修改这个文件使它适合代码生成。

函数数= mandelbrot_count (maxIterations xGrid yGrid)曼德布洛特百分比计算z0 = xGrid + 1我* yGrid;数= 1(大小(z0));z = z0;n = 0: maxIterations z z =。* z + z0;在= abs (z) < = 2;数=数+内部;结束数=日志(数);

创建一个MATLAB脚本调用mandelbrot_test.m用下面的代码行。脚本生成一个1000 -,- 1000网格的部分(x)和虚部(y)之间的限制规定xlimylim。它还称mandelbrot_count功能和情节产生的曼德尔勃特集合。

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);% %曼德布洛特在MATLAB计算数= mandelbrot_count (maxIterations xGrid yGrid);%显示图(1)显示亮度图像(x, y,数);colormap([飞机();flipud(飞机());0 0 0));轴标题(曼德尔勃特集合与MATLAB的);

运行原MATLAB代码

曼德布洛特的例子运行

之前的MATLAB版本了曼德尔勃特集合算法适用于代码生成,您可以测试原始代码的功能。

  1. 改变当前的MATLAB工作文件夹包含的位置mandelbrot_count.mmandelbrot_test.m。GPU编码器生成的代码在这个文件夹的地方。如果你没有改变你当前工作文件夹完全访问这个文件夹。

  2. 运行mandelbrot_test脚本。

测试脚本运行并显示的几何边界内的曼德布洛特设定的变量xlimylim

曼德尔勃特集合的情节MATLAB

准备MATLAB代码生成代码

之前你和GPU编码器生成代码,检查原始的MATLAB代码编码问题。

在设计时检查问题

有两个工具,可以帮助你发现在设计时代码生成问题:

  • 代码分析工具

  • 代码生成工具准备

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

请注意

代码分析器不检测所有代码生成问题。消除错误或警告后,分析仪检测的代码,编译代码与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右上角的编辑是绿色的。分析没有检测错误、警告或改善代码的机会。

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

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

    代码分析器消息指标仍然是绿色,这表明它并没有发现任何代码生成问题。

  4. 映射mandelbrot_countCUDA内核函数,通过将修改原始的MATLAB代码coder.gpu.kernelfun编译指示在体内的功能。

    函数数= mandelbrot_count (maxIterations xGrid yGrid)% # codegen%添加kernelfun编译指示触发内核创建coder.gpu.kernelfun;曼德布洛特百分比计算z0 = xGrid + 1我* yGrid;数= 1(大小(z0));z = z0;n = 0: maxIterations z z =。* z + z0;在= abs (z) < = 2;数=数+内部;结束数=日志(数);

    如果你使用coder.gpu.kernelfun编译指示,GPU编码器试图映射函数的计算mandelbrot_countGPU。

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

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

打开GPU编码器应用程序

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

选择源文件

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

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

  2. 点击下一个和去定义输入类型的一步。编码问题的应用分析函数和代码生成。如果应用程序标识问题,它打开了审查代码生成准备页面,您可以查看并修复问题。在这个例子中,因为应用程序没有检测问题,它打开了定义输入类型页面。

定义输入类型

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

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

  • 直接输入的输入类型。

关于输入规范的更多信息,请参阅输入规格

在这个例子中,定义输入的属性maxIterations,xGrid,yGrid,指定测试文件mandelbrot_test.m:

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

  2. 点击Autodefine输入类型

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

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

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

检查运行时问题

检查运行时问题一步生成一个墨西哥人文件从你的入口点函数,墨西哥人功能,运行和报告问题。这一步是可选的。然而,这是一个最佳实践来执行这一步骤。使用此步骤,您可以检测并修复缺陷生成的GPU中更难诊断代码。

GPU执行GPU-specific检查编码器提供了选项。当您选择该选项,GPU编码器生成CUDA代码和一个墨西哥人文件从你的入口点函数,墨西哥人功能,运行和报告问题。一些GPU-specific运行时检查包括:

  • 检查泄漏。

  • 栈大小一致性检查。

请注意

在代码中可能存在某些MATLAB构造导致的检查运行时问题但通过GPU-specific检查失败CPU-specific检查。

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

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

  3. 使GPU-specific检查,选择GPU选项按钮。点击检查问题

    应用程序生成一个墨西哥人的功能。它运行测试脚本mandelbrot_test更换要求mandelbrot_count与调用生成的墨西哥人。如果应用程序检测到问题在墨西哥人一代或执行函数,它提供了警告和错误消息。你可以点击这些信息导航到有问题的代码并修复这个问题。在本例中,应用程序并不检测问题。墨西哥人函数具有相同的功能与原始mandelbrot_count函数。

    检查运行时问题的窗户GPU编码器应用

    请注意

    在代码中可能存在某些MATLAB构造导致的检查运行时问题但通过GPU-specific检查失败CPU-specific检查。

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

生成CUDA代码

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

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

  2. 生成对话框,你可以选择你想要的类型的构建GPU编码器来执行。这个表中列出了可用的选项。

    构建类型 描述
    源代码

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

    墨西哥人

    编译后的代码运行在MATLAB。

    静态库

    二进制为静态链接库与外部项目。

    动态库

    二进制为动态链接库与外部项目。

    可执行的

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

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

    查看高级选项,选择更多设置- > GPU的代码。到编译器标志选项,添加——fmad = false。这个标志,当传递到学校网站,指示编译器禁用浮点Multiply-add (FMAD)优化。此选项设置,防止生成的代码,因为建筑中的数值不匹配的CPU和GPU之间的区别。有关更多信息,请参见数值CPU和GPU之间的区别

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

  3. 点击生成

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

    应用程序窗口显示成功的墨西哥人的代码生成

  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.mat包含统计数据生成的GPU MAT-file代码。这个MAT-file包含cuda_Kernel变量的线程和块大小的信息,共享和常量内存使用,每个内核的输入和输出参数。的cudaMalloccudaMemcpy变量包含所有的GPU的大小信息变量和的数量memcpy主机和设备之间的调用。

    截图的内容MAT-file包含代码生成信息

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

检查页面完成工作流

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

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

验证生成的代码的正确性

为了验证生成的墨西哥人文件的正确性,明白了验证生成的代码的正确性

另请参阅

应用程序

功能

对象

相关的话题