主要内容

GPU代码生成:了曼德尔勃特集合

这个例子展示了如何生成CUDA®代码从一个简单的MATLAB®函数通过使用GPU编码器™。曼德尔勃特集合的实现通过使用标准的MATLAB命令作为入口点函数。下面的例子使用了codegen命令来生成一个墨西哥人运行在GPU上的函数。您可以运行墨西哥人函数来检查运行时错误。

第三方的先决条件

要求

这个示例中生成CUDA墨西哥人,有以下第三方的要求。

  • CUDA启用NVIDIA GPU®和兼容的驱动程序。

可选

等non-MEX构建静态、动态库或可执行文件,这个例子有以下额外的需求。

验证GPU环境

验证所需的编译器和库运行这个示例设置正确,使用coder.checkGpuInstall函数。

envCfg = coder.gpuEnvConfig (“主机”);envCfg。BasicCodegen = 1;envCfg。安静= 1;coder.checkGpuInstall (envCfg);

曼德尔勃特集合

了曼德尔勃特集合中该地区复平面组成的值z_0美元定义的轨迹

$ $ z_ {k + 1} = {z_k} ^ 2 + z_0 k = 0, 1, $ $

保持有界$ k \ rightarrow \ infty $。曼德尔勃特集合的整体几何图所示。这种观点没有边缘的分辨率显示丰富详细的结构的边界外。

定义输入区域

选择一组限制,指定一个高度放大了曼德尔勃特集合的一部分主心形和之间的山谷p / q美元灯泡了。一个1000 x1000网格的美元重新\ \ {x} $我\ \}{y美元创建这两个限制。曼德布洛特然后在每个迭代算法网格的位置。迭代的500足以呈现图像完整的决议。

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);

曼德布洛特入口点函数

mandelbrot_count.m入口点函数包含了曼德尔勃特集合的矢量化实现基于代码提供的电子书与MATLAB实验由克里夫硅藻土。% # codegen指令打开MATLAB代码生成错误检查。当GPU编码器遇到coder.gpu.kernelfun编译指示,它试图并行化计算在这个函数中,然后将它映射到GPU。

类型mandelbrot_count
函数计算= mandelbrot_count (maxIterations、xGrid yGrid) % # codegen % 2016 - 2019版权MathWorks, inc . z0 = xGrid + 1我* yGrid;数= 1(大小(z0));%计算映射到GPU。coder.gpu.kernelfun;z = z0;n = 0: maxIterations z z =。* z + z0;在= abs (z) < = 2;数=数+内部;结束数=日志(数);

测试的功能mandelbrot_count

运行mandelbrot_count函数与xGrid yGrid以前生成的值,然后画出结果。

数= mandelbrot_count (maxIterations xGrid yGrid);图(2)中,显示亮度图像(x, y,数);colormap([飞机();flipud(飞机());0 0 0));标题(曼德尔勃特集合在MATLAB的);轴

生成函数的CUDA墨西哥人

生成CUDA的墨西哥人mandelbrot_count函数创建一个GPU配置对象并运行代码codegen命令。因为CPU和GPU之间的结构差异,数值验证并不总是匹配。这个场景是真的当使用单一数据类型在MATLAB代码和执行积累操作对这些单一数据类型值。这样曼德布洛特例子甚至双数据类型引起数字错误。不匹配的原因之一是,GPU浮点单位使用融合浮点Multiply-Add (FMAD)指令和CPU不使用这些指令。的fmad = false选项传递到学校网站这个FMAD优化编译器关闭。

cfg = coder.gpuConfig (墨西哥人的);cfg.GpuConfig。CompilerFlags =“——fmad = false”;codegen配置cfgarg游戏{maxIterations, xGrid, yGrid}mandelbrot_count
代码生成成功:查看报告,打开(“codegen /墨西哥人/ mandelbrot_count / html / report.mldatx”)。

函数运行的墨西哥人

生成一个墨西哥人函数之后,验证它与原始MATLAB入口点函数相同的功能。运行生成的mandelbrot_count_mex和策划的结果。

countGPU = mandelbrot_count_mex (maxIterations xGrid yGrid);图(2)中,显示亮度图像(x, y, countGPU);colormap([飞机();flipud(飞机());0 0 0));标题(曼德尔勃特集合在GPU的);轴

另请参阅

应用程序

功能

对象

相关的话题