创建CUDA最简单的方法®内核将放置coder.gpu.kernelfun.
pragma进入你的基本的马铃薯®功能。主要功能也称为顶层或者入口点功能。当GPU编码器™遭遇时凯尔弗伦
Pragma,它试图并行化此功能中的所有计算,然后将其映射到GPU。
在本教程中,您将学习如何:
使用使用的准备您的MATLAB代码进行CUDA代码生成凯尔弗伦
pragma。
创建并设置GPU编码器项目。
定义函数输入属性。
检查代码生成准备和运行时问题。
指定代码生成属性。
使用该方法生成CUDA代码Codegen.
命令。
本教程需要以下产品:s manbetx 845
马铃薯
Matlab Coder™
GPU编码器
C编译器
nvidia.®GPU为CUDA启用了
CUDA工具包和司机
编译器和库的环境变量。有关更多信息,请参阅环境变量
Mandelbrot Set是由值组成的复平面中的区域Z.0.由此等式定义的轨迹仍然有界限k→∞。
Mandelbrot集的整体几何形状如图所示。此视图没有分辨率,以显示在集合边界之外的条纹的丰富详细结构。在增加的放大率下,Mandelbrot集合呈现出逐渐呈现更精细的递归细节的详细边界。
对于本教程,请选择一组限制,该限制指定在主心形和主题之间的谷中的高度缩放部分的曼德布特。P / Q.灯泡到左边。1000×1000个真实部件网格(X)和虚部(y)在这两个限制之间创建。然后在每个网格位置迭代Mandelbrot算法。迭代500的迭代号以完整分辨率呈现图像。
最大= 500;gridsize = 1000;XLIM = [-0.748766713922161,-0.7487667077771757];ylim = [0.12364084894862,0.123640851045266];
本教程使用CPU上运行的标准MATLAB命令使用Mandelbrot设置。将该计算化为view,使得每个位置同时更新。
创建一个名为matlab脚本mandelbrot_count.m.
使用以下代码行。此代码是Mandelbrot集的基线矢量化MATLAB实现。在本教程中,您修改此文件以使其适用于代码生成。
功能count = mandelbrot_count(maxIrtations,xgrid,ygrid)%mandelbrot计算z0 = xgrid + 1i * ygrid;count = =(大小(z0));z = z0;为了n = 0:maxIterations z = z。* z + z0;内部= abs(z)<= 2;count =内部计数+;结尾count = log(count);
创建一个名为matlab脚本mandelbrot_test.m.
使用以下代码行。该脚本生成1000×1000个Grid的真实部件(X)和虚部(y)在规定的限制之间XLIM.
和ylim.
。它还叫了mandelbrot_count.
功能和绘制由此产生的Mandelbrot Set。
最大= 500;gridsize = 1000;XLIM = [-0.748766713922161,-0.7487667077771757];ylim = [0.12364084894862,0.123640851045266];x = Linspace(XLIM(1),XLIM(2),网格化);y = linspace(ylim(1),ylim(2),gridsize);[Xgrid,Ygrid] = meshgrid(x,y);Matlab中的%% mandelbrot计算count = mandelbrot_count(maxIrtations,Xgrid,Ygrid);% 表演图(1)ImageC(x,y,count);Colormap([Jet(); Flipud(Jet()); 0 0 0]);轴离开标题('Mandelbrot与matlab'设置');
在制作适合代码生成的Mandelbrot Set算法的MATLAB版本之前,您可以测试原始代码的功能。
将MATLAB的当前工作文件夹更改为包含在上一步中创建的两个文件的位置。GPU编码器将生成的代码放在此文件夹中,如果您没有完全访问此文件夹,请更改当前工作文件夹。
打开mandelbrot_test.
Matlab编辑器中的脚本。
单击“运行”按钮运行测试脚本或进入mandelbrot_test.
在matlab命令窗口中。
测试脚本运行并显示由变量设置的边界内的mandelbrot的几何图形XLIM.
和ylim.
。
要开始使MATLAB代码适合代码生成的过程,请使用该文件mandelbrot_count.m.
。
将MATLAB当前文件夹设置为包含本教程文件的工作文件夹。
在Matlab编辑器中,开放mandelbrot_count.m.
。该文件在MATLAB编辑器中打开。MATLAB编辑器右上角的代码分析仪消息指示器为绿色。分析仪没有检测到代码的改进错误,警告或机会。
打开MATLAB以进行代码生成错误检查。函数声明后,添加%#codegen.
指示。
功能count = mandelbrot_count(maxIrtations,xgrid,ygrid)%#codegen.
代码分析仪消息指示符保持绿色,表示它尚未检测到代码生成问题。
映射到mandelbrot_count.
函数到CUDA内核,通过放置来修改原始的MATLAB代码coder.gpu.kernelfun.
邦特玛外面为了
- 活体。
功能count = mandelbrot_count(maxIrtations,xgrid,ygrid)%#codegen.%mandelbrot计算z0 = xgrid + 1i * ygrid;count = =(大小(z0));%添加Kernelfun Pragma触发内核创建coder.gpu.kernelfun;z = z0;为了n = 0:maxIterations z = z。* z + z0;内部= abs(z)<= 2;count =内部计数+;结尾count = log(count);
使用时coder.gpu.kernelfun.
Pragma,GPU编码器尝试映射功能中的计算mandelbrot_count.
到GPU。
保存文件。您现在可以使用命令行界面编译代码。
你可以使用Codegen.
命令将MATLAB函数转换为CUDA兼容的静态或动态库,可执行文件或MEX函数,而不是使用GPU编码器应用程序。
在编译时,GPU编码器必须知道到入口点函数的所有输入的数据类型。因此,如果您的入口点函数有输入,则必须在您将文件编译的时间指定其数据类型Codegen.
功能。
您可以生成输入,然后使用- args.
选项在Codegen.
函数让GPU编码器确定输入参数的类,大小和复杂性。生成输入mandelbrot_count.
函数,使用这些命令:
最大= 500;gridsize = 1000;XLIM = [-0.748766713922161,-0.7487667077771757];ylim = [0.12364084894862,0.123640851045266];x = Linspace(XLIM(1),XLIM(2),网格化);y = linspace(ylim(1),ylim(2),gridsize);[Xgrid,Ygrid] = meshgrid(x,y);
或者,您可以通过使用通过使用输入数据来指定输入点函数的输入的大小,类型和复杂性,而不会产生输入数据Coder.typeof.
功能。
args = cell(1,1);args {1} = cell(3,1);args {1} {1} = coder.typeof(0);args {1} {2} = coder.typeof(0,[1000 1000]);args {1} {3} = coder.typeof(0,[1000 1000]);
配置构建设置,例如输出文件名,位置,类型,您必须创建编码器配置对象。要创建对象,请使用Coder.gpuconfig.
功能。例如,创建一个Coder.mexcodeConfig
代码生成对象用于使用Codegen.
生成MEX功能时,使用:
cfg = coder.gpuconfig('mex');
其他可用选项是:
cfg = coder.gpuconfig('lib');
,创建用于使用的代码生成配置对象Codegen.
生成CUDA静态库时。
cfg = coder.gpuconfig('dll');
,创建用于使用的代码生成配置对象Codegen.
生成CUDA动态库时。
cfg = coder.gpuconfig('exe');
,创建用于使用的代码生成配置对象Codegen.
生成CUDA可执行文件时。
有关更多信息,请参阅Coder.gpuconfig.
。
每个配置对象都有一组参数,初始化为默认值。您可以使用DOT表示法一次修改一个配置对象参数的值。使用此语法:
configuration_object.property = Value.
您可以启用相同的设置使用GPU编码器应用程序的代码通过使用以下命令行等效项:
cfg = coder.gpuconfig('mex');cfg.g.guconfig.compilerflags =.'--fmad = false';cfg.generateReport = true;
这CFG.
配置对象具有常见的配置参数Matlab编码器和GPU编码器和GPU编码器特定的参数。您可以看到所有可用的GPU特定属性CFG.
通过键入配置对象cfg.g.guconfig
在matlab命令窗口中。
>> CFG.GPUCONFIG ANS = CONFICE'Stacklimitperthread:1024 Mallocthreshold:200选择:-1
这--fmad = false.
传递给的标志NVCC.
,指示编译器禁用浮点乘法(FMAD)优化。根据CPU和GPU的架构差异,设置此选项以防止生成代码中的数值不匹配。有关更多信息,请参阅CPU与GPU之间的数值差异。
有关配置参数的更多信息Matlab编码器和GPU编码器,见coder.codeConfig
班级。
您可以创建构建脚本mandelbrot_codegen.m.
这使先前提到的一系列命令进行了自动化。
入门示例的%GPU代码生成(Mandelbrot_Count.m)%% create'coder.mexcodeConfig'的configuration对象。cfg = coder.gpuconfig('mex');cfg.generateReport = true;cfg.g.guconfig.compilerflags =.'--fmad = false';%%定义入口点'mandelbrot_count'的参数类型。args = cell(1,1);args {1} = cell(3,1);args {1} {1} = coder.typeof(0);args {1} {2} = coder.typeof(0,[1000 1000]);args {1} {3} = coder.typeof(0,[1000 1000]);%%调用GPU编码器。Codegen.-Config.CFG.mandelbrot_count.- args.args {1}
这Codegen.
命令打开文件mandelbrot_count.m.
并将MATLAB代码转换为CUDA代码。
这-报告
选项指示Codegen.
要生成用于调试MATLAB代码的代码生成报告。
这- args.
选项指示Codegen.
编译文件mandelbrot_count.m.
通过使用输入参数的类,大小和复杂性最大那Xgrid., 和ygrid.。
这-Config.
选项指示Codegen.
使用指定的配置对象进行代码生成。
代码生成成功后,您可以通过单击查看结果代码生成报告查看报告在matlab命令窗口中。
>> mandelbrot_codegen代码生成成功:查看报告
要验证生成的MEX文件的正确性,请参阅验证生成的代码的正确性。