主要内容

使用命令行接口代码生成

最简单的方法创建CUDA®内核是地方coder.gpu.kernelfun编译指示到你MATLAB®函数。主函数也称为顶级入口点函数。当GPU编码器™邂逅kernelfun编译指示,它试图并行化计算在这个函数,然后将它映射到GPU。

学习目标

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

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

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

  • 定义函数输入属性。

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

  • 指定代码生成属性。

  • 通过使用生成CUDA代码codegen命令。

教程的先决条件

本教程需要以下产品:下载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实现了曼德尔勃特集合。后来在本教程中,您修改这个文件使它适合代码生成。

函数数= 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位置包含您在上一步中创建两个文件。GPU编码器生成的代码在这个文件夹的地方,如果你没有改变你的当前工作文件夹完全访问这个文件夹。

  2. 打开mandelbrot_test在MATLAB脚本编辑器。

  3. 点击Run按钮运行测试脚本或通过输入mandelbrot_test在MATLAB命令窗口。

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

    曼德尔勃特集合的情节MATLAB

使MATLAB适用于代码生成代码

开始的过程让你的MATLAB代码适用于代码生成,使用该文件mandelbrot_count.m

  1. 设置你的MATLAB当前文件夹的工作文件夹,其中包含文件对于本教程。

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

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

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

    代码分析器消息指标仍然是绿色,这表明它没有检测到代码生成问题。

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

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

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

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

从命令行代码生成

您可以使用codegen命令将MATLAB函数CUDA兼容的静态或动态库,可执行文件,或墨西哥人功能,而不是使用GPU编码器的应用。

定义输入类型

在编译时,GPU编码器必须知道所有输入的数据类型的入口点函数。因此,如果你的入口点函数的输入,您必须指定其数据类型时,你编译的文件codegen函数。

您可以生成输入,然后使用arg游戏选项codegen函数让GPU编码器确定类,输入参数的大小和复杂性。生成的输入为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);

此外,您可以指定大小、类型和复杂性的入口点函数的输入没有生成输入数据使用coder.typeof函数。

ARGS =细胞(1,1);ARGS{1} =细胞(3,1);ARGS {1} {1} = coder.typeof (0);ARGS{1}{2} =编码器。typeof(0, 1000年[1000]);ARGS{1}{3} =编码器。typeof(0, 1000年[1000]);

构建配置

等配置构建设置输出文件名称、位置、类型,您必须创建编码器配置对象。创建对象,使用coder.gpuConfig函数。例如,要创建一个coder.MexCodeConfig为使用代码生成对象codegen当生成一个墨西哥人功能,使用:

cfg = coder.gpuConfig(墨西哥人);

其他可用的选项是:

  • cfg = coder.gpuConfig(“自由”);,创建一个代码生成配置为使用对象codegen当生成CUDA静态库。

  • cfg = coder.gpuConfig (dll);,创建一个代码生成配置为使用对象codegen当生成一个CUDA动态库。

  • cfg = coder.gpuConfig (exe);,创建一个代码生成配置为使用对象codegen当生成CUDA可执行。

有关更多信息,请参见coder.gpuConfig

每个配置对象都有一组参数,初始化为默认值。可以使用点符号修改一个配置对象参数的值。使用这种语法:

configuration_object。属性=值

您可以启用的设置一样通过使用GPU编码器应用代码生成通过使用以下命令行等价物:

cfg = coder.gpuConfig (墨西哥人的);cfg.GpuConfig。CompilerFlags =“——fmad = false”;cfg。GenerateReport = true;

cfg配置对象的配置参数,是常见的MATLAB编码器和GPU GPU Coder-specific编码器和参数。你可以看到所有的GPU-specific属性中可用cfg配置对象通过输入cfg.GpuConfig在MATLAB命令窗口。

> > cfg。GpuConfig ans =配置属性:启用:1 MallocMode:“离散”KernelNamePrefix:“EnableCUBLAS: 1 EnableCUSOLVER: 1 EnableCUFFT: 1基准:0 SafeBuild: 0 ComputeCapability:“3.5”CustomComputeCapability:“CompilerFlags:“StackLimitPerThread: 1024 MallocThreshold: 200 SelectCudaDevice: 1

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

更多信息是常见的配置参数MATLAB编码器和GPU编码器,看到coder.CodeConfig类。

构建脚本

您可以创建一个构建脚本mandelbrot_codegen.m前面所提到的,自动化的一系列命令。

% GPU入门示例代码生成(mandelbrot_count.m)% %创建配置对象的类“coder.MexCodeConfig”。cfg = coder.gpuConfig (墨西哥人的);cfg。GenerateReport = true;cfg.GpuConfig。CompilerFlags =“——fmad = false”;% %为入口点定义参数类型“mandelbrot_count”。ARGS =细胞(1,1);ARGS{1} =细胞(3,1);ARGS {1} {1} = coder.typeof (0);ARGS{1}{2} =编码器。typeof(0, 1000年[1000]);ARGS{1}{3} =编码器。typeof(0, 1000年[1000]);% %调用GPU编码器。codegen配置cfgmandelbrot_countarg游戏ARGS {1}

codegen命令打开文件mandelbrot_count.m,将MATLAB代码转换成CUDA的代码。

  • 报告选项指示codegen生成的代码生成报告,可以使用它调试MATLAB代码。

  • arg游戏选项指示codegen要编译的文件mandelbrot_count.m通过使用类、大小和复杂性的输入参数maxIterations,xGrid,yGrid

  • 配置选项指示codegen使用指定的配置对象代码生成。

当代码生成成功,您可以通过单击视图生成的代码生成报告查看报告在MATLAB命令窗口。

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

代码生成报告窗口

验证生成的代码的正确性

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

另请参阅

应用程序

功能

对象

相关的话题