最简单的方法创建CUDA®内核是地方coder.gpu.kernelfun
编译指示到你主MATLAB®函数。主函数也称为顶级或入口点函数。当GPU编码器™邂逅kernelfun
编译指示,它试图并行化计算在这个函数,然后将它映射到GPU。
在本教程中,您将了解如何:
准备CUDA MATLAB代码通过使用生成代码kernelfun
编译指示。
创建和设置一个GPU编码器项目。
定义函数输入属性。
检查准备和运行时代码生成问题。
指定代码生成属性。
通过使用生成CUDA代码codegen
命令。
本教程需要以下产品:下载188bet金宝搏
MATLAB
MATLAB编码器™
GPU编码器
C编译器
英伟达®CUDA GPU支持
CUDA工具包和司机
环境变量的编译器和库。有关更多信息,请参见环境变量
了曼德尔勃特集合中该地区复平面组成的值z0的定义的轨迹方程仍然有限k→∞。
曼德尔勃特集合的整体几何图所示。这种观点没有边缘的分辨率显示丰富详细的结构的边界外。在不断的放大,一个精心设计的边界,揭示了曼德尔勃特集合展品逐步精细递归的细节。
对于本教程,选择一组限制,指定一个高度放大了曼德尔勃特集合的一部分主心形和之间的山谷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)之间的限制规定xlim
和ylim
。它还称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位置包含您在上一步中创建两个文件。GPU编码器生成的代码在这个文件夹的地方,如果你没有改变你的当前工作文件夹完全访问这个文件夹。
打开mandelbrot_test
在MATLAB脚本编辑器。
点击Run按钮运行测试脚本或通过输入mandelbrot_test
在MATLAB命令窗口。
测试脚本运行并显示的几何边界内的曼德布洛特设定的变量xlim
和ylim
。
开始的过程让你的MATLAB代码适用于代码生成,使用该文件mandelbrot_count.m
。
设置你的MATLAB当前文件夹的工作文件夹,其中包含文件对于本教程。
在MATLAB编辑器中,开放mandelbrot_count.m
。在MATLAB编辑器中打开的文件。右上角的代码分析器消息指示器的MATLAB编辑是绿色的。分析没有检测错误、警告或改善代码的机会。
打开MATLAB代码生成错误检查。函数声明后,添加% # codegen
指令。
函数数= mandelbrot_count (maxIterations xGrid yGrid)% # codegen
代码分析器消息指标仍然是绿色,这表明它没有检测到代码生成问题。
映射mandelbrot_count
CUDA内核函数,通过将修改原始的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_count
GPU。
保存文件。现在,您可以编译代码通过使用命令行界面。
您可以使用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代码生成成功:查看报告
为了验证生成的墨西哥人文件的正确性,明白了验证生成的代码的正确性。