使用命令行接口生成代码
创建CUDA最简单的方法®果仁是用来放置的coder.gpu.kernelfun
编译指示到你主要的MATLAB®函数。主要的功能也被称为顶级或入口点函数。当GPU Coder™遇到kernelfun
pragma,它尝试在这个函数中并行所有的计算,然后将其映射到GPU。
学习目标
在本教程中,您将学习如何:
为CUDA代码生成准备MATLAB代码
kernelfun
编译指示。创建并设置一个GPU Coder项目。
定义函数输入属性。
检查代码生成准备情况和运行时问题。
指定代码生成属性。
方法生成CUDA代码
codegen
命令。
教程的先决条件
本教程需要以下产品:2022世界杯八强谁会赢?
MATLAB
MATLAB编码器™
GPU编码器
C编译器
英伟达®CUDA启用GPU
CUDA工具包和驱动程序
编译器和库的环境变量。有关更多信息,请参见环境变量
示例:Mandelbrot集合
描述
曼德尔布罗特集是复平面上由这些值组成的区域z0这个方程定义的轨迹有界于k→∞.
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集算法适合于代码生成之前,您可以测试原始代码的功能。
将MATLAB的当前工作文件夹更改为包含您在上一步中创建的两个文件的位置。GPU Coder将生成的代码放在这个文件夹中,如果您没有对这个文件夹的完全访问权限,请更改您当前的工作文件夹。
打开
mandelbrot_test
脚本在MATLAB编辑器。通过单击运行按钮运行测试脚本或通过输入
mandelbrot_test
在MATLAB命令窗口中。测试脚本运行,并在变量设置的边界内显示Mandelbrot的几何形状
xlim
而且ylim
.
使MATLAB适合代码生成的代码
要开始使您的MATLAB代码适合于代码生成的过程,请使用该文件mandelbrot_count.m
.
将您的MATLAB当前文件夹设置为包含本教程文件的工作文件夹。
在MATLAB编辑器中,打开
mandelbrot_count.m
.该文件在MATLAB编辑器中打开。MATLAB编辑器右上角的代码分析器消息指示符是绿色的。分析器没有检测到代码中的错误、警告或改进的机会。打开MATLAB进行代码生成错误检查。函数声明之后,添加
% # codegen
指令。函数count = mandelbrot_count(maxIterations, xGrid, yGrid)% # codegen
Code Analyzer消息指示器保持绿色,表示它没有检测到代码生成问题。
映射
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.kernelfun
pragma, GPU Coder试图将计算映射到函数中mandelbrot_count
GPU。保存文件。现在可以使用命令行界面编译代码了。
从命令行生成代码
您可以使用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
通过使用输入参数的类、大小和复杂性maxIterations,xGrid,yGrid.的
配置
选项指示codegen
使用指定的配置对象进行代码生成。
当代码生成成功时,您可以通过单击查看生成的代码生成报告查看报告在MATLAB命令窗口中。
>> mandelbrot_codegen Code generation successful:查看报告
验证生成的代码的正确性
要验证生成的MEX文件的正确性,请参见验证生成的代码的正确性.