主要内容

GPU代码生成:Mandelbrot集

这个例子展示了如何使用GPU Coder™从一个简单的MATLAB®函数生成CUDA®代码。使用标准MATLAB命令的Mandelbrot集实现充当入口点函数。本例使用codegen命令,生成运行在GPU上的MEX函数。您可以运行MEX函数来检查运行时错误。

第三方的先决条件

要求

本例生成CUDA MEX,第三方需求如下。

  • CUDA支持NVIDIA®GPU和兼容的驱动程序。

可选

对于非mex构建,例如静态、动态库或可执行文件,此示例具有以下附加要求。

检查GPU环境

要验证运行此示例所需的编译器和库是否已正确设置,请使用coder.checkGpuInstall函数。

envCfg = code . 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 $.Mandelbrot集合的整体几何如图所示。这个视图没有分辨率来显示集合边界外丰富的细节结构的边缘。

定义输入区域

选择一组限制,指定曼德尔布罗特集的高度放大部分,该部分位于主心脏线和p / q美元它左边的灯泡。一个1000 x1000网格的美元重新\ \ {x} $而且我\ \}{y美元在这两个极限之间创建。然后在每个网格位置迭代Mandelbrot算法。迭代次数为500足以以全分辨率渲染图像。

maxIterations = 500;gridSize = 1000;Xlim = [-0.748766713922161, -0.748766707771757];Ylim = [0.123640844894862, 0.123640851045266];x = linspace(xlim(1), xlim(2), gridSize);y = linspace(ylim(1), ylim(2), gridSize);[xGrid,yGrid] = meshgrid(x, y);

曼德尔布罗特入口点函数

mandelbrot_count.m入口点函数包含基于电子书中提供的代码的Mandelbrot集的向量化实现MATLAB实验Cleve Moler著。%#codegen指令打开MATLAB进行代码生成错误检查。当GPU编码器遇到coder.gpu.kernelfunpragma,它尝试在这个函数中并行所有的计算,然后将其映射到GPU。

类型mandelbrot_count
function count = mandelbrot_count(maxIterations, xGrid, yGrid) %#codegen % Copyright 2016-2019 The MathWorks, Inc. z0 = xGrid + 1i*yGrid;Count = ones(size(z0));将计算映射到GPU。coder.gpu.kernelfun;Z = z0;*z + z0;Inside = abs(z)<=2;计数=计数+内部;结束计数= log(count);

测试功能mandelbrot_count

运行mandelbrot_count函数使用先前生成的xGrid, yGrid值,然后绘制结果。

count = mandelbrot_count(maxIterations, xGrid, yGrid);图(2),imagesc(x, y, count);Colormap ([jet();flipud(jet());0 0 0]);标题(MATLAB上的Mandelbrot集);轴

为函数生成CUDA MEX

生成CUDA MEXmandelbrot_count函数,创建GPU代码配置对象并运行codegen命令。由于CPU和GPU之间的架构差异,数值验证并不总是匹配的。在MATLAB代码中使用单个数据类型并对这些单个数据类型值执行累加操作时,这种情况是正确的。就像这个Mandelbrot示例一样,即使是双数据类型也会导致数值错误。造成这种不匹配的原因之一是GPU浮点单元使用融合的浮点乘法-加法(FMAD)指令,而CPU不使用这些指令。的fmad = false属性的学校网站编译器关闭这个FMAD优化。

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

运行MEX命令功能

在生成MEX函数后,验证它是否具有与原始MATLAB入口点函数相同的功能。运行生成的mandelbrot_count_mex然后画出结果。

countGPU = mandelbrot_count_mex(maxIterations, xGrid, yGrid);图(2),imagesc(x, y, countGPU);Colormap ([jet();flipud(jet());0 0 0]);标题(在GPU上设置Mandelbrot);轴

另请参阅

应用程序

功能

对象

相关的话题