主要内容

代码生成使用命令行界面

创建CUDA最简单的方法®内核将放置coder.gpu.kernelfun.pragma进入你的基本的马铃薯®功能。主要功能也称为顶层或者入口点功能。当GPU编码器™遭遇时凯尔弗伦Pragma,它试图并行化此功能中的所有计算,然后将其映射到GPU。

学习目标

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

  • 使用使用的准备您的MATLAB代码进行CUDA代码生成凯尔弗伦pragma。

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

  • 定义函数输入属性。

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

  • 指定代码生成属性。

  • 使用该方法生成CUDA代码Codegen.命令。

教程先决条件

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

  • 马铃薯

  • Matlab Coder™

  • GPU编码器

  • C编译器

  • nvidia.®GPU为CUDA启用了

  • CUDA工具包和司机

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

示例:Mandelbrot Set

描述

Mandelbrot Set是由值组成的复平面中的区域Z.0.由此等式定义的轨迹仍然有界限k→∞

Z. K. + 1 = Z. K. 2 + Z. 0. K. = 0. 1 ......

Mandelbrot集的整体几何形状如图所示。此视图没有分辨率,以显示在集合边界之外的条纹的丰富详细结构。在增加的放大率下,Mandelbrot集合呈现出逐渐呈现更精细的递归细节的详细边界。

Mandelbrot Set的几何形状

算法

对于本教程,请选择一组限制,该限制指定在主心形和主题之间的谷中的高度缩放部分的曼德布特。P / Q.灯泡到左边。1000×1000个真实部件网格(X)和虚部(y)在这两个限制之间创建。然后在每个网格位置迭代Mandelbrot算法。迭代500的迭代号以完​​整分辨率呈现图像。

最大= 500;gridsize = 1000;XLIM = [-0.748766713922161,-0.7487667077771757];ylim = [0.12364084894862,0.123640851045266];

本教程使用CPU上运行的标准MATLAB命令使用Mandelbrot设置。将该计算化为view,使得每个位置同时更新。

教程文件

创建一个名为matlab脚本mandelbrot_count.m.使用以下代码行。此代码是Mandelbrot集的基线矢量化MATLAB实现。在本教程中,您修改此文件以使其适用于代码生成。

功能count = mandelbrot_count(maxIrtations,xgrid,ygrid)%mandelbrot计算z0 = xgrid + 1i * ygrid;count = =(大小(z0));z = z0;为了n = 0:maxIterations z = z。* z + z0;内部= abs(z)<= 2;count =内部计数+;结尾count = log(count);

创建一个名为matlab脚本mandelbrot_test.m.使用以下代码行。该脚本生成1000×1000个Grid的真实部件(X)和虚部(y)在规定的限制之间XLIM.ylim.。它还叫了mandelbrot_count.功能和绘制由此产生的Mandelbrot Set。

最大= 500;gridsize = 1000;XLIM = [-0.748766713922161,-0.7487667077771757];ylim = [0.12364084894862,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(maxIrtations,Xgrid,Ygrid);% 表演图(1)ImageC(x,y,count);Colormap([Jet(); Flipud(Jet()); 0 0 0]);轴离开标题('Mandelbrot与matlab'设置');

跑原来马铃薯代码

运行mandelbrot示例

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

  1. 将MATLAB的当前工作文件夹更改为包含在上一步中创建的两个文件的位置。GPU编码器将生成的代码放在此文件夹中,如果您没有完全访问此文件夹,请更改当前工作文件夹。

  2. 打开mandelbrot_test.Matlab编辑器中的脚本。

  3. 单击“运行”按钮运行测试脚本或进入mandelbrot_test.在matlab命令窗口中。

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

    在matlab中设置的mandelbrot

制作马铃薯代码适用于代码生成

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

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

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

  3. 打开MATLAB以进行代码生成错误检查。函数声明后,添加%#codegen.指示。

    功能count = mandelbrot_count(maxIrtations,xgrid,ygrid)%#codegen.

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

  4. 映射到mandelbrot_count.函数到CUDA内核,通过放置来修改原始的MATLAB代码coder.gpu.kernelfun.邦特玛外面为了- 活体。

    功能count = mandelbrot_count(maxIrtations,xgrid,ygrid)%#codegen.%mandelbrot计算z0 = xgrid + 1i * ygrid;count = =(大小(z0));%添加Kernelfun Pragma触发内核创建coder.gpu.kernelfun;z = z0;为了n = 0:maxIterations z = z。* z + z0;内部= abs(z)<= 2;count =内部计数+;结尾count = log(count);

    使用时coder.gpu.kernelfun.Pragma,GPU编码器尝试映射功能中的计算mandelbrot_count.到GPU。

  5. 保存文件。您现在可以使用命令行界面编译代码。

从命令行生成代码

你可以使用Codegen.命令将MATLAB函数转换为CUDA兼容的静态或动态库,可执行文件或MEX函数,而不是使用GPU编码器应用程序。

定义输入类型

在编译时,GPU编码器必须知道到入口点函数的所有输入的数据类型。因此,如果您的入口点函数有输入,则必须在您将文件编译的时间指定其数据类型Codegen.功能。

您可以生成输入,然后使用- args.选项在Codegen.函数让GPU编码器确定输入参数的类,大小和复杂性。生成输入mandelbrot_count.函数,使用这些命令:

最大= 500;gridsize = 1000;XLIM = [-0.748766713922161,-0.7487667077771757];ylim = [0.12364084894862,0.123640851045266];x = Linspace(XLIM(1),XLIM(2),网格化);y = linspace(ylim(1),ylim(2),gridsize);[Xgrid,Ygrid] = meshgrid(x,y);

或者,您可以通过使用通过使用输入数据来指定输入点函数的输入的大小,类型和复杂性,而不会产生输入数据Coder.typeof.功能。

args = cell(1,1);args {1} = cell(3,1);args {1} {1} = coder.typeof(0);args {1} {2} = coder.typeof(0,[1000 1000]);args {1} {3} = coder.typeof(0,[1000 1000]);

构建配置

配置构建设置,例如输出文件名,位置,类型,您必须创建编码器配置对象。要创建对象,请使用Coder.gpuconfig.功能。例如,创建一个Coder.mexcodeConfig代码生成对象用于使用Codegen.生成MEX功能时,使用:

cfg = coder.gpuconfig('mex');

其他可用选项是:

  • cfg = coder.gpuconfig('lib');,创建用于使用的代码生成配置对象Codegen.生成CUDA静态库时。

  • cfg = coder.gpuconfig('dll');,创建用于使用的代码生成配置对象Codegen.生成CUDA动态库时。

  • cfg = coder.gpuconfig('exe');,创建用于使用的代码生成配置对象Codegen.生成CUDA可执行文件时。

有关更多信息,请参阅Coder.gpuconfig.

每个配置对象都有一组参数,初始化为默认值。您可以使用DOT表示法一次修改一个配置对象参数的值。使用此语法:

configuration_object.property = Value.

您可以启用相同的设置使用GPU编码器应用程序的代码通过使用以下命令行等效项:

cfg = coder.gpuconfig('mex');cfg.g.guconfig.compilerflags =.'--fmad = false';cfg.generateReport = true;

CFG.配置对象具有常见的配置参数Matlab编码器和GPU编码器和GPU编码器特定的参数。您可以看到所有可用的GPU特定属性CFG.通过键入配置对象cfg.g.guconfig在matlab命令窗口中。

>> CFG.GPUCONFIG ANS = CONFICE'Stacklimitperthread:1024 Mallocthreshold:200选择:-1

--fmad = false.传递给的标志NVCC.,指示编译器禁用浮点乘法(FMAD)优化。根据CPU和GPU的架构差异,设置此选项以防止生成代码中的数值不匹配。有关更多信息,请参阅CPU与GPU之间的数值差异

有关配置参数的更多信息Matlab编码器和GPU编码器,见coder.codeConfig班级。

构建脚本

您可以创建构建脚本mandelbrot_codegen.m.这使先前提到的一系列命令进行了自动化。

入门示例的%GPU代码生成(Mandelbrot_Count.m)%% create'coder.mexcodeConfig'的configuration对象。cfg = coder.gpuconfig('mex');cfg.generateReport = true;cfg.g.guconfig.compilerflags =.'--fmad = false';%%定义入口点'mandelbrot_count'的参数类型。args = cell(1,1);args {1} = cell(3,1);args {1} {1} = coder.typeof(0);args {1} {2} = coder.typeof(0,[1000 1000]);args {1} {3} = coder.typeof(0,[1000 1000]);%%调用GPU编码器。Codegen.-Config.CFG.mandelbrot_count.-  args.args {1}

Codegen.命令打开文件mandelbrot_count.m.并将MATLAB代码转换为CUDA代码。

  • -报告选项指示Codegen.要生成用于调试MATLAB代码的代码生成报告。

  • - args.选项指示Codegen.编译文件mandelbrot_count.m.通过使用输入参数的类,大小和复杂性最大Xgrid., 和ygrid.

  • -Config.选项指示Codegen.使用指定的配置对象进行代码生成。

代码生成成功后,您可以通过单击查看结果代码生成报告查看报告在matlab命令窗口中。

>> mandelbrot_codegen代码生成成功:查看报告

代码生成报告窗口

验证生成的代码的正确性

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

也可以看看

应用

职能

对象

相关话题