创建CUDA最简单的方法®果仁是用来放置coder.gpu.kernelfun
编译指示到你主MATLAB®函数。主要功能也称为顶级或入口点函数。当GPU编码器™遭遇kernelfun
pragma,它尝试并行化这个函数中的所有计算,然后将它映射到GPU。
在本教程中,您将学习如何:
为CUDA代码生成准备您的MATLAB代码使用kernelfun
编译指示。
创建并设置一个GPU编码器项目。
定义函数输入属性。
检查代码生成准备情况和运行时问题。
指定代码生成属性。
生成CUDA代码使用codegen
命令。
本教程需要以下产品:下载188bet金宝搏
MATLAB
MATLAB编码器™
GPU编码器
C编译器
英伟达®GPU支持CUDA
CUDA工具包和驱动程序
编译器和库的环境变量。有关更多信息,请参见环境变量
曼德尔勃洛特集是复平面中由这些值组成的区域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集。这个计算被向量化,这样每个位置都是同时更新的。
创建一个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)之间的界限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计算在MATLABcount = mandelbrot_count(maxIterations, xGrid, yGrid);%显示图(1)imagesc(x, y, count);Colormap ([jet();flipud(jet());0 0 0]);轴从标题(曼德尔勃洛特集与MATLAB);
在使Mandelbrot集算法的MATLAB版本适合代码生成之前,可以测试原始代码的功能。
将MATLAB的当前工作文件夹更改为包含上一步中创建的两个文件的位置。GPU编码器将生成的代码放在此文件夹中,如果您没有对该文件夹的完全访问权,请更改当前的工作文件夹。
打开mandelbrot_test
脚本在MATLAB编辑器中。
通过单击运行按钮运行测试脚本或通过输入mandelbrot_test
在MATLAB命令窗口中。
测试脚本运行并显示由变量设置的边界内的Mandelbrot的几何形状xlim
和ylim
.
要开始使您的MATLAB代码适合代码生成的过程,请使用该文件mandelbrot_count.m
.
将MATLAB当前文件夹设置为包含本教程文件的工作文件夹。
在MATLAB编辑器中打开mandelbrot_count.m
.文件在MATLAB编辑器中打开。MATLAB Editor右上角的Code Analyzer消息指示器是绿色的。分析器没有检测到代码中的错误、警告或改进机会。
打开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指令以触发内核创建coder.gpu.kernelfun;z = z0;为n = 0:maxIterations z = z.*z + z0;在= abs (z) < = 2;Count = Count +内部;结束数=日志(数);
当使用coder.gpu.kernelfun
pragma, GPU编码器尝试映射函数中的计算mandelbrot_count
GPU。
保存文件。现在可以使用命令行界面编译代码了。
你可以使用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
通过使用输入参数的类、大小和复杂性maxIterations,xGrid,yGrid.
的配置
选项指示codegen
使用指定的配置对象生成代码。
当代码生成成功时,您可以通过单击查看生成的代码报告查看报告在MATLAB命令窗口中。
>> mandelbrot_codegen代码生成成功:查看报告
要验证生成的MEX文件的正确性,请参见验证生成代码的正确性.