通过使用生成代码GPU编码器应用程序
最简单的方法创建CUDA®内核是地方coder.gpu.kernelfun
编译指示到你主MATLAB®函数。主函数也称为顶级或入口点函数。当GPU编码器™遇到kernelfun
编译指示,它试图并行化计算在这个函数,然后将它映射到GPU。关于GPU内核的更多信息,请参阅GPU编程范式。
学习目标
在本教程中,您将了解如何:
准备CUDA MATLAB代码通过使用生成代码
kernelfun
编译指示。创建和设置一个GPU编码器项目。
定义函数输入属性。
检查准备和运行时代码生成问题。
指定代码生成属性。
生成CUDA代码通过使用GPU编码器应用。
教程的先决条件
本教程需要以下产品:下载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实现了曼德尔勃特集合,每一个点(xGrid yGrid)
在网格,计算迭代索引数
在定义的轨迹方程达到的距离2
从原点。然后它返回的自然对数数
,生成的颜色编码的阴谋了曼德尔勃特集合。后来在本教程中,您修改这个文件使它适合代码生成。
函数数= 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版本了曼德尔勃特集合算法适用于代码生成,您可以测试原始代码的功能。
改变当前的MATLAB工作文件夹包含的位置
mandelbrot_count.m
和mandelbrot_test.m
。GPU编码器生成的代码在这个文件夹的地方。如果你没有改变你当前工作文件夹完全访问这个文件夹。运行
mandelbrot_test
脚本。
测试脚本运行并显示的几何边界内的曼德布洛特设定的变量xlim
和ylim
。
准备MATLAB代码生成代码
之前你和GPU编码器生成代码,检查原始的MATLAB代码编码问题。
在设计时检查问题
有两个工具,可以帮助你发现在设计时代码生成问题:
代码分析工具
代码生成工具准备
代码分析器是一个工具纳入MATLAB代码编辑器,不断检查当你进入它。代码分析器报告问题和建议修改最大化代码的性能和可维护性。识别特定警告和错误代码生成从MATLAB代码,添加% # codegen
MATLAB文件指令。有关更多信息,请参见代码分析器的偏好。
请注意
代码分析器不检测所有代码生成问题。消除错误或警告后,分析仪检测的代码,编译代码与GPU编码器来确定代码的其他合规问题。
代码生成工具准备屏幕的MATLAB代码特性和功能不支持代码生成。金宝app这个工具提供了一个报告,列出的问题和建议进行MATLAB代码适合代码生成。您可以访问代码生成在这些方面准备的工具:
在浏览器当前文件夹,右键单击MATLAB文件,其中包含的入口点函数。
在命令行-使用
coder.screener
函数与gpu
国旗。在GPU编码器应用-在指定入口点文件,应用程序运行代码分析器和代码生成工具。
检查问题代码生成时间
您可以使用GPU编码器在代码生成时间来检查问题。当GPU编码器检测到错误或警告,它生成一个错误报告,描述了这些问题,并提供有问题的MATLAB代码的链接。有关更多信息,请参见代码生成报告。
使MATLAB适用于代码生成代码
开始的过程让你的MATLAB代码适用于代码生成,使用该文件mandelbrot_count.m
。
设置你的MATLAB当前文件夹的工作文件夹,其中包含文件对于本教程。
在MATLAB编辑器中,开放
mandelbrot_count.m
。代码分析器消息指示器MATLAB右上角的编辑是绿色的。分析没有检测错误、警告或改善代码的机会。函数声明后,添加
% # codegen
指令打开特定的错误检查代码生成。函数数= mandelbrot_count (maxIterations xGrid yGrid)% # codegen
代码分析器消息指标仍然是绿色,这表明它并没有发现任何代码生成问题。
映射
mandelbrot_count
CUDA内核函数,通过将修改原始的MATLAB代码coder.gpu.kernelfun
编译指示在体内的功能。函数数= mandelbrot_count (maxIterations xGrid yGrid)% # codegen%添加kernelfun编译指示触发内核创建coder.gpu.kernelfun;曼德布洛特百分比计算z0 = xGrid + 1我* yGrid;数= 1(大小(z0));z = z0;为n = 0: maxIterations z z =。* z + z0;在= abs (z) < = 2;数=数+内部;结束数=日志(数);
如果你使用
coder.gpu.kernelfun
编译指示,GPU编码器试图映射函数的计算mandelbrot_count
GPU。保存文件。现在可以通过使用GPU编码器应用编译代码。
通过使用生成代码GPU编码器应用程序
打开GPU编码器应用程序
在MATLAB将来发布应用程序选项卡,在代码生成,单击GPU编码器应用图标。你也可以打开应用程序通过输入gpucoder
在MATLAB命令窗口。应用程序打开选择源文件页面。
选择源文件
在选择源文件页面,输入或选择的名称主函数,
mandelbrot_count
。主函数也称为顶级或入口点函数。应用程序创建了一个项目使用默认名称mandelbrot_count.prj
在当前文件夹。点击下一个和去定义输入类型的一步。编码问题的应用分析函数和代码生成。如果应用程序标识问题,它打开了审查代码生成准备页面,您可以查看并修复问题。在这个例子中,因为应用程序没有检测问题,它打开了定义输入类型页面。
定义输入类型
代码生成器必须确定所有的变量的数据类型在编译时MATLAB文件。因此,您必须指定数据类型的输入变量。您可以指定输入数据类型在这两个方面:
提供一个测试文件,称该项目为入口点函数。GPU编码器的应用可以推断通过运行测试文件的输入参数类型。
直接输入的输入类型。
关于输入规范的更多信息,请参阅输入规格。
在这个例子中,定义输入的属性maxIterations
,xGrid
,yGrid
,指定测试文件mandelbrot_test.m
:
输入或选择测试文件
mandelbrot_test.m
。点击Autodefine输入类型。
测试文件
mandelbrot_test.m
调用的入口点函数,mandelbrot_count.m
预期的输入类型。应用程序输入的推断maxIterations
是双(1 x1)
和输入xGrid
和yGrid
是双(1000 x1000)
。点击下一个去检查运行时问题的一步。
检查运行时问题
的检查运行时问题一步生成一个墨西哥人文件从你的入口点函数,墨西哥人功能,运行和报告问题。这一步是可选的。然而,这是一个最佳实践来执行这一步骤。使用此步骤,您可以检测并修复缺陷生成的GPU中更难诊断代码。
GPU执行GPU-specific检查编码器提供了选项。当您选择该选项,GPU编码器生成CUDA代码和一个墨西哥人文件从你的入口点函数,墨西哥人功能,运行和报告问题。一些GPU-specific运行时检查包括:
检查泄漏。
栈大小一致性检查。
请注意
在代码中可能存在某些MATLAB构造导致的检查运行时问题但通过GPU-specific检查失败CPU-specific检查。
打开检查运行时问题对话框中,单击检查问题箭头。
在检查运行时问题对话框中,指定一个测试文件或输入输入调用入口点函数的代码示例。对于这个示例,使用测试文件
mandelbrot_test.m
你用来定义输入类型。使GPU-specific检查,选择GPU选项按钮。点击检查问题。
应用程序生成一个墨西哥人的功能。它运行测试脚本
mandelbrot_test
更换要求mandelbrot_count
与调用生成的墨西哥人。如果应用程序检测到问题在墨西哥人一代或执行函数,它提供了警告和错误消息。你可以点击这些信息导航到有问题的代码并修复这个问题。在本例中,应用程序并不检测问题。墨西哥人函数具有相同的功能与原始mandelbrot_count
函数。请注意
在代码中可能存在某些MATLAB构造导致的检查运行时问题但通过GPU-specific检查失败CPU-specific检查。
点击下一个去生成代码的一步。
生成CUDA代码
打开生成对话框中,单击生成箭头。
在生成对话框,你可以选择你想要的类型的构建GPU编码器来执行。这个表中列出了可用的选项。
构建类型 描述 源代码
CUDA源代码集成与外部项目。
墨西哥人
编译后的代码运行在MATLAB。
静态库
二进制为静态链接库与外部项目。
动态库
二进制为动态链接库与外部项目。
可执行的
独立的程序(需要一个定制的CUDA主要文件)。
对于本教程,集构建类型来
墨西哥人(.mex)
。通过生成一个墨西哥人的输出,您可以检查在MATLAB生成的CUDA代码的正确性。墨西哥人的构建类型不需要额外的设置工具链和硬件板。它也没有提供选项来生成源代码。GPU编码器可以自动选择一个可用的CUDA工具链只要环境变量正确设置。查看高级选项,选择更多设置- > GPU的代码。到编译器标志选项,添加
——fmad = false
。这个标志,当传递到学校网站
,指示编译器禁用浮点Multiply-add (FMAD)优化。此选项设置,防止生成的代码,因为建筑中的数值不匹配的CPU和GPU之间的区别。有关更多信息,请参见数值CPU和GPU之间的区别。点击生成。
GPU编码器生成墨西哥人的可执行文件
mandelbrot_count_mex
在你的工作目录。的< pwd > \ codegen \墨西哥人\ mandelbrot_count
文件夹包含其他所有生成的文件包括CUDA (* .cu)和头文件来源。GPU编码器的应用表明,代码生成成功。它显示源MATLAB生成文件和输出文件页面的左侧。在变量选项卡,它显示的MATLAB源程序变量的信息。在目标建立日志选项卡,显示建立日志,包括编译器警告和错误。默认情况下,在代码窗口中,应用程序显示了CUDA源文件mandelbrot_count.cu
。查看不同的文件,源代码或输出文件窗格中,单击文件名。查看代码生成报告,点击查看报告。该报告提供了MATLAB代码的链接和生成的CUDA (* .cu)文件。它还提供了编译时信息在MATLAB代码中变量和表达式。这些信息能帮助你找到来源的错误和警告。它还可以帮助您调试代码中的代码生成问题。有关更多信息,请参见代码生成报告。
的GPU内核上节生成的代码选项卡提供的内核列表中创建GPU代码生成。这个列表的条目链接到相关的源代码。例如,当你点击mandelbrot_count_kernel1,这个内核的代码部分显示在浏览器窗口的代码。
你检查报告后,可以关闭代码生成报告窗口。查看报告后,打开
report.mldatx
在< pwd > \ codegen \墨西哥人\ mandelbrot_cout \ html
文件夹中。的
< pwd > \ codegen \墨西哥人\ mandelbrot_count
包含了gpu_codegen_info.mat
包含统计数据生成的GPU MAT-file代码。这个MAT-file包含cuda_Kernel
变量的线程和块大小的信息,共享和常量内存使用,每个内核的输入和输出参数。的cudaMalloc
和cudaMemcpy
变量包含所有的GPU的大小信息变量和的数量memcpy
主机和设备之间的调用。在GPU编码器应用程序,单击下一个打开完成工作流程页面。
检查页面完成工作流
的完成工作流程页面显示代码生成成功。它提供了一个项目总结和MATLAB源文件的链接,代码生成报告,生成的输出二进制文件。您可以保存配置参数当前GPU编码器的项目作为一个MATLAB脚本。看到MATLAB编码器项目转换为MATLAB脚本。
验证生成的代码的正确性
为了验证生成的墨西哥人文件的正确性,明白了验证生成的代码的正确性。