主要内容

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

定义输入区域

选择一组限制,指定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入口点函数

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

类型mandelbrot_count
函数计数= mandelbrot_count(maxIterations, xGrid, yGrid) %#codegen %版权所有The MathWorks, Inc. z0 = xGrid + 1i*yGrid;Count = ones(size(z0));%映射计算到GPU。coder.gpu.kernelfun;Z = z0;for n = 0:maxIterations z = z.*z + z0;内= abs(z)<=2;Count = Count + inside;结束计数= 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 .gpu config (墨西哥人的);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]);标题(“Mandelbrot设置在GPU上”);轴

另请参阅

应用程序

功能

对象

相关的话题

Baidu
map