通过使用代码生成GPU编码器应用程序
创建CUDA的最简单方法®内核要放置coder.gpu.kernelfun
巴格马进入你的基本的MATLAB®功能。主要功能也称为顶层或者入口点功能。当GPU Coder™遇到内尔富恩
PRAGMA,它试图并行化此函数中的所有计算,然后将其映射到GPU。有关GPU内核的更多信息,请参阅GPU编程范式。
学习目标
在本教程中,您将学习如何:
通过使用
内尔富恩
巴格马。创建并设置一个GPU编码器项目。
定义函数输入属性。
检查代码生成准备和运行时问题。
指定代码生成属性。
使用GPU编码器应用程序生成CUDA代码。
教程先决条件
本教程需要以下产品:s manbetx 845
MATLAB
MATLAB CODER™
GPU编码器
C ++编译器
nvidia®启用了cuda的GPU
CUDA工具包和驱动程序
编译器和库的环境变量。有关更多信息,请参阅环境变量。
示例:Mandelbrot集
描述
mandelbrot集是由值组成的复杂平面中的区域z0该方程定义的轨迹在其上保持一致K→∞。
这overall geometry of the Mandelbrot set is shown in the figure. This view does not have the resolution to show the richly detailed structure of the fringe just outside the boundary of the set. At increasing magnifications, the Mandelbrot set exhibits an elaborate boundary that reveals progressively finer recursive detail.
算法
在本教程中,选择一组限制,这些限制指定了主心脏和主体之间的山谷中的曼德布罗特的高度缩放部分P/Qbulb to its left. A 1000-by-1000 grid of real parts (X)和虚构的部分(y)在这两个限制之间创建。然后在每个网格位置迭代Mandelbrot算法。500的迭代编号可完整分辨率。
最大值= 500;网格= 1000;xlim = [-0.748766713922161,-0.74876670777757];ylim = [0.123640844894862,0.123640851045266];
This tutorial uses an implementation of the Mandelbrot set by using standard MATLAB commands running on the CPU. This calculation is vectorized such that every location is updated simultaneously.
教程文件
创建一个称为MATLAB功能mandelbrot_count.m
带有以下代码行。该代码是Mandelbrot集的基线矢量化MATLAB实现。每一点(XGRID,YGRID)
在网格中,它计算迭代索引数数
方程定义的轨迹达到的轨迹达到2
来自原产地。然后它返回自然对数数数
,用于生成Mandelbrot集的颜色编码图。在本教程的稍后,您可以修改此文件以使其适合代码生成。
功能count = mandelbrot_count(MaxIterations,Xgrid,Ygrid)%mandelbrot计算Z0 = XGRID + 1i*ygrid;count =一个(size(z0));z = z0;为了n = 0:maxiterations z = z。*z + z0;内部= abs(z)<= 2;count = count +内部;结尾count = log(count);
创建一个称为MATLAB脚本mandelbrot_test.m
带有以下代码行。该脚本生成1000 x-1000的真实零件网格(X)和虚构的部分(y)在指定的限制之间xlim
和Ylim
。它还称mandelbrot_count
功能和plots the resulting Mandelbrot set.
最大值= 500;网格= 1000;xlim = [-0.748766713922161,-0.74876670777757];ylim = [0.123640844894862,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(MaxIterations,Xgrid,Ygrid);% 节目图(1)imagesc(x,y,count);colormap([JET(); flipud(Jet()); 0 0 0]);轴离开标题(“带有matlab的mandelbrot”);
运行原始MATLAB代码
跑过Mandelbrot Example
在制作适用于代码生成的Mandelbrot Set算法的MATLAB版本之前,您可以测试原始代码的功能。
将当前的MATLAB工作文件夹更改为包含的位置
mandelbrot_count.m
和mandelbrot_test.m
。GPU编码器将生成的代码放在此文件夹中。如果您无法完全访问此文件夹,请更改当前的工作文件夹。跑过
mandelbrot_test
脚本。
测试脚本运行并显示由变量设置的边界内的mandelbrot的几何形状xlim
和Ylim
。
准备MATLAB代码生成代码
在使用GPU编码器生成代码之前,请检查原始MATLAB代码中的编码问题。
在设计时检查问题
有两种工具可以帮助您在设计时间检测代码生成问题:
代码Analyzer tool
代码生成准备工具
这代码Analyzer is a tool incorporated into the MATLAB Editor that continuously checks your code as you enter it. The Code Analyzer reports issues and recommends modifications to maximize performance and maintainability of your code. To identify the warnings and errors specific to code generation from your MATLAB code, add the%#codegen
您的MATLAB文件指令。有关更多信息,请参阅代码分析仪首选项。
笔记
代码分析仪未检测到所有代码生成问题。在消除了代码分析器检测到的错误或警告后,将代码与GPU编码器编译,以确定代码是否存在其他合规性问题。
代码生成准备工具筛选了MATLAB代码的功能和功能,这些功能不支持代码生成。万博1manbetx该工具提供了一份报告,该报告列出了使MATLAB代码适合代码生成的问题和建议。您可以以这些方式访问代码生成准备工具:
在当前文件夹浏览器中 - 右键单击包含入口点函数的MATLAB文件。
在命令行 - 使用
编码器。Screener
功能with the-gpu
flag.在GPU编码器应用程序中 - 指定入口点文件后,该应用程序运行代码分析仪和代码生成准备工作工具。
在代码生成时间检查问题
您可以使用GPU编码器在代码生成时间检查问题。当GPU编码器检测到错误或警告时,它会生成一个错误报告,该报告描述了问题并提供了有问题的MATLAB代码的链接。有关更多信息,请参阅代码生成报告。
做MATLAB适用于代码生成的代码
要开始使MATLAB代码适合代码生成的过程,请使用该文件mandelbrot_count.m
。
将MATLAB电流文件夹设置为包含本教程文件的工作文件夹。
在里面MATLABEditor, open
mandelbrot_count.m
。MATLAB编辑器右上角的代码分析仪消息指示器是绿色的。该分析仪未检测到该法规改进的错误,警告或机会。函数声明后,添加
%#codegen
指令打开特定于代码生成的错误检查。功能count = mandelbrot_count(MaxIterations,Xgrid,Ygrid)%#codegen
代码分析仪消息指标保持绿色,表明它没有检测到任何代码生成问题。
映射
mandelbrot_count
功能到CUDA内核,通过放置原始MATLAB代码来修改原始MATLAB代码coder.gpu.kernelfun
pragma in the body of the function.功能count = mandelbrot_count(MaxIterations,Xgrid,Ygrid)%#codegen%添加kernelfun pragma触发内核创建coder.gpu.kernelfun;%mandelbrot计算Z0 = XGRID + 1i*ygrid;count =一个(size(z0));z = z0;为了n = 0:maxiterations z = z。*z + z0;内部= abs(z)<= 2;count = count +内部;结尾count = log(count);
如果您使用
coder.gpu.kernelfun
pragma, GPU Coder attempts to map the computations in the functionmandelbrot_count
到GPU。Save the file. You are now ready to compile your code by using the GPU Coder app.
通过使用GPU编码器应用程序
打开GPU编码器应用程序
在MATLAB工具条上应用标签,下代码生成,,,,click the GPU Coder app icon. You can also open the app by typingGPUCODER
在MATLAB命令窗口中。该应用程序打开选择源文件页面。
选择源文件
在选择source files page, enter or select the name of the基本的功能,
mandelbrot_count
。主要功能也称为顶层或者入口点功能。该应用程序创建一个带有默认名称的项目mandelbrot_count.prj
在当前文件夹中。点击下一个和去Define Input Types步。这app analyzes the function for coding issues and code generation readiness. If the app identifies issues, it opens the审查代码生成准备就绪您可以在其中查看和解决问题的页面。在此示例中,由于该应用没有检测到问题,因此它打开了Define Input Types页。
Define Input Types
代码生成器必须在编译时确定MATLAB文件中所有变量的数据类型。因此,您必须指定所有输入变量的数据类型。您可以通过以下两种方式指定输入数据类型:
Provide a test file that calls the project entry-point functions. The GPU Coder app can infer the input argument types by running the test file.
直接输入输入类型。
有关输入规格的更多信息,请参见输入规范。
在此示例中,定义输入的属性最大值
,,,,XGRID
, 和ygrid
,指定测试文件mandelbrot_test.m
:
输入或选择测试文件
mandelbrot_test.m
。点击Autodefine输入类型。
这test file
mandelbrot_test.m
调用入口点函数,mandelbrot_count.m
具有预期的输入类型。应用程序注入输入最大值
是双(1x1)
和输入XGRID
和ygrid
是双(1000x1000)
。点击下一个去检查运行时间问题步。
检查运行时间问题
这检查运行时间问题步骤从您的入口点功能中生成MEX文件,运行MEX函数并报告问题。此步骤是可选的。但是,执行此步骤是最好的做法。使用此步骤,您可以检测和修复在生成的GPU代码中更难诊断的缺陷。
GPU编码器提供了此时执行GPU特定检查的选项。当您选择此选项时,GPU编码器会从入口点功能中生成CUDA代码和MEX文件,运行MEX函数并报告问题。一些特定于GPU的运行时间检查包括:
检查寄存器溢出。
堆栈尺寸一致性检查。
笔记
您的代码中可能有某些MATLAB构造引起检查运行时间问题为了使CPU特定的检查失败,但通过了特定于GPU的检查。
打开检查运行时间问题对话框,单击检查问题箭。
在里面检查运行时间问题dialog box, specify a test file or enter code that calls the entry-point function with example inputs. For this example, use the test file
mandelbrot_test.m
您用来定义输入类型。要启用特定于GPU的检查,请选择GPU选项按钮。点击检查问题。
该应用程序生成MEX函数。它运行测试脚本
mandelbrot_test
更换电话mandelbrot_count
带有发电的MEX的电话。如果该应用在MEX功能生成或执行过程中检测到问题,则提供警告和错误消息。您可以单击这些消息以导航到有问题的代码并解决问题。在此示例中,该应用程序未检测到问题。MEX功能具有与原始功能相同的功能mandelbrot_count
功能。笔记
您的代码中可能有某些MATLAB构造引起检查运行时间问题为了使CPU特定的检查失败,但通过了特定于GPU的检查。
点击下一个去生成代码步。
产生库达代码
打开产生对话框,单击产生箭。
在里面产生对话框,您可以选择要GPU编码器执行的构建类型。可用选项在此表中列出。
构建类型 描述 源代码
CUDA源代码与外部项目集成。
梅克斯
编译代码以在MATLAB内部运行。
静态库
Binary library for static linking with an external project.
动态库
用于与外部项目的动态链接的二进制库。
可执行
独立程序(需要自定义CUDA主文件)。
对于本教程,设置构建类型至
MEX(.mex)
。通过生成MEX输出,您可以从MATLAB内检查生成的CUDA代码的正确性。MEX构建类型不需要其他设置工具链和硬件板。它还不提供仅生成源代码的选项。GPU编码器可以自动选择可用的CUDA工具链环境变量设置正确。要查看高级选项,请选择更多设置 - > GPU代码。到编译器标志选项,添加
-fmad = false
。This flag, when passed to theNVCC
,指示编译器禁用浮点多元ADD(FMAD)优化。由于CPU和GPU之间的架构差异,因此设置了此选项以防止生成代码中的数值不匹配。有关更多信息,请参阅CPU和GPU之间的数值差异。点击产生。
GPU编码器生成MEX可执行文件
mandelbrot_count_mex
在您的工作文件夹中。这
文件夹包含所有其他生成的文件,包括CUDA源(*.cu)和标头文件。GPU编码器应用程序表示代码生成成功。它显示页面左侧的源Matlab文件和生成的输出文件。在Variables选项卡,它显示有关MATLAB源变量的信息。在Target Build Log选项卡,它显示构建日志,包括编译器警告和错误。默认情况下,在代码窗口中,该应用显示CUDA源文件\codegen\mex\mandelbrot_count mandelbrot_count.cu
。要查看其他文件,在源代码或者输出文件窗格,单击文件名。要查看代码生成报告,请单击查看报告。该报告提供了指向您的MATLAB代码和生成的CUDA(*.cu)文件的链接。它还为MATLAB代码中的变量和表达式提供了编译时间信息。此信息可帮助您找到错误和警告源。它还可以帮助您在代码中调试代码生成问题。有关更多信息,请参阅代码生成报告。
这GPUKernels关于生成的代码TAB提供了在GPU代码生成期间创建的内核列表。此列表中的项目链接到相关源代码。例如,当您单击时mandelbrot_count_kernel1,此内核的代码部分显示在代码浏览器窗口中。
查看报告后,您可以关闭代码生成报告窗户。要稍后查看报告,请打开
report.mldatx
在
文件夹。\codegen\mex\mandelbrot_cout\html 这
包含\codegen\mex\mandelbrot_count gpu_codegen_info.mat
包含生成的GPU代码的统计信息的MAT文件。这个垫子包含cuda_kernel
variable that has information about the thread and block sizes, shared and constant memory usage, and input and output arguments of each kernel. ThecudaMalloc
和cudamcpy
variables contain information about the size of all the GPU variables and the number ofmemcpy
主机和设备之间的呼叫。在GPU编码器应用中,单击下一个打开完成工作流程页。
查看完成工作流页面
这完成工作流程页面显示代码生成成功。It provides a project summary and links to the MATLAB source files, the code generation report, and the generated output binaries. You can save the configuration parameters of the current GPU Coder project as a MATLAB script. See将MATLAB编码器项目转换为MATLAB脚本。
验证生成代码的正确性
要验证生成的MEX文件的正确性,请参阅验证生成代码的正确性。