主要内容

使用命令行接口生成代码

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

学习目标

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

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

  • 创建并设置一个GPU Coder项目。

  • 定义函数输入属性。

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

  • 指定代码生成属性。

  • 方法生成CUDA代码codegen命令。

教程的先决条件

本教程需要以下产品:2022世界杯八强谁会赢?

  • MATLAB

  • MATLAB编码器™

  • GPU编码器

  • C编译器

  • 英伟达®CUDA启用GPU

  • CUDA工具包和驱动程序

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

示例:Mandelbrot集合

描述

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

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

Mandelbrot集合的整体几何结构如图所示。这个视图没有显示集合边界外丰富的细节结构的分辨率。随着放大倍数的增加,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集。这个计算是向量化的,这样每个位置都可以同时更新。

教程文件

创建一个名为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 + inside;结束数=日志(数);

创建一个名为mandelbrot_test.m使用以下代码行。该脚本生成1000 * 1000的实部件网格(x)和虚部(y)之间指定的限制xlim而且ylim.它还调用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计算在MATLAB中count = mandelbrot_count(maxIterations, xGrid, yGrid);%显示图(1)imagesc(x, y, count);Colormap ([jet();flipud(jet());0 0 0]);轴标题(“Mandelbrot集与MATLAB”);

运行原MATLAB代码

运行Mandelbrot示例

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

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

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

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

    测试脚本运行,并在变量设置的边界内显示Mandelbrot的几何形状xlim而且ylim

    MATLAB中Mandelbrot集的图

使MATLAB适合代码生成的代码

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

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

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

  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 pragma来触发内核创建coder.gpu.kernelfun;z = z0;n = 0:maxIterations z = z.*z + z0;在= abs (z) < = 2;Count = Count + inside;结束数=日志(数);

    当使用coder.gpu.kernelfunpragma, GPU Coder试图将计算映射到函数中mandelbrot_countGPU。

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

从命令行生成代码

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

定义输入类型

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

可以生成输入,然后使用arg游戏选项codegen函数让GPU Coder决定输入参数的类、大小和复杂性。为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 Coder和特定于GPU Coder的参数。中可用的所有特定于gpu的属性cfg通过键入配置对象cfg。GpuConfig在MATLAB命令窗口中。

> > cfg。GpuConfig = 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 Coder,见编码器。代码Config类。

构建脚本

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

% GPU代码生成示例(mandelbrot_count.m)创建类'code . 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 Coder。codegen配置cfgmandelbrot_countarg游戏ARGS {1}

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

  • 报告选项指示codegen生成一个代码生成报告,可以用来调试MATLAB代码。

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

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

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

>> mandelbrot_codegen Code generation successful:查看报告

代码生成报告窗口

验证生成的代码的正确性

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

另请参阅

应用程序

功能

对象

相关的话题

Baidu
map