主要内容

使用命令行接口生成代码

创建CUDA最简单的方法®果仁是用来放置coder.gpu.kernelfun编译指示到你MATLAB®函数。主要功能也称为顶级入口点函数。当GPU编码器™遭遇kernelfunpragma,它尝试并行化这个函数中的所有计算,然后将它映射到GPU。

学习目标

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

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

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

  • 定义函数输入属性。

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

  • 指定代码生成属性。

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

教程的先决条件

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

  • MATLAB

  • MATLAB编码器™

  • GPU编码器

  • C编译器

  • 英伟达®GPU支持CUDA

  • CUDA工具包和驱动程序

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

例如:Mandelbrot集合

描述

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

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

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

曼德尔勃洛特集的几何

算法

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

函数count = mandelbrot_count(maxIterations, xGrid, yGrid)曼德布洛特百分比计算z0 = xGrid + 1i*yGrid;数= 1(大小(z0));z = z0;n = 0:maxIterations z = z.*z + z0;在= abs (z) < = 2;Count = 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];x = linspace(xlim(1), xlim(2), gridSize);y = linspace(ylim(1), ylim(2), gridSize);[xGrid,yGrid] = meshgrid(x, y);%% Mandelbrot计算在MATLABcount = mandelbrot_count(maxIterations, xGrid, yGrid);%显示图(1)imagesc(x, y, count);Colormap ([jet();flipud(jet());0 0 0]);轴标题(曼德尔勃洛特集与MATLAB);

运行原MATLAB代码

运行Mandelbrot示例

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

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

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

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

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

    曼德尔勃洛特集的MATLAB绘图

使MATLAB适合代码生成的代码

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

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

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

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

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

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

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

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

    当使用coder.gpu.kernelfunpragma, GPU编码器尝试映射函数中的计算mandelbrot_countGPU。

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

从命令行生成代码

你可以使用codegen命令将MATLAB函数转换为CUDA兼容的静态或动态库、可执行程序或MEX函数,而不是使用GPU Coder应用程序。

定义输入类型

在编译时,GPU编码器必须知道所有输入到入口点函数的数据类型。因此,如果入口点函数有输入,则必须在使用codegen函数。

您可以生成输入,然后使用arg游戏选项codegen函数让GPU编码器确定输入参数的类、大小和复杂性。为…产生输入mandelbrot_count函数,请使用以下命令:

maxIterations = 500;gridSize = 1000;Xlim = [-0.748766713922161, -0.748766707771757];Ylim = [0.123640844894862, 0.123640851045266];x = linspace(xlim(1), xlim(2), gridSize);y = linspace(ylim(1), ylim(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函数。例如,要创建编码器。MexCodeConfig使用的代码生成对象codegen当生成MEX函数时,使用:

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编码器特定的参数。属性中可以看到所有特定于gpu的属性cfg通过以下方式配置对象cfg。GpuConfig在MATLAB命令窗口中。

> > cfg。GpuConfig ans = config with properties: Enabled: 1 MallocMode: 'discrete' KernelNamePrefix: " EnableCUBLAS: 1 EnableCUSOLVER: 1 EnableCUFFT: 1 Benchmarking: 0 SafeBuild: 0 ComputeCapability: '3.5' CustomComputeCapability: " CompilerFlags: " StackLimitPerThread: 1024 MallocThreshold: 200 SelectCudaDevice: -1

——fmad = false国旗传递给学校网站,指示编译器禁用浮点乘法加(FMAD)优化。设置此选项是为了防止由于CPU和GPU的架构差异而导致生成代码中的数字不匹配。有关更多信息,请参见CPU和GPU的数值差异

有关常用配置参数的更多信息MATLAB编码器和GPU编码器,参见编码器。代码Config类。

构建脚本

您可以创建一个构建脚本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通过使用输入参数的类、大小和复杂性maxIterationsxGrid,yGrid

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

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

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

代码生成报告窗口

验证生成代码的正确性

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

另请参阅

应用程序

功能

对象

相关的话题