GPU代码生成:Mandelbrot集
这个例子展示了如何使用GPU Coder™从一个简单的MATLAB®函数生成CUDA®代码。使用标准MATLAB命令的Mandelbrot集实现充当入口点函数。本例使用codegen
命令,生成运行在GPU上的MEX函数。您可以运行MEX函数来检查运行时错误。
第三方的先决条件
要求
本例生成CUDA MEX,第三方需求如下。
CUDA支持NVIDIA®GPU和兼容的驱动程序。
可选
对于非mex构建,例如静态、动态库或可执行文件,此示例具有以下附加要求。
英伟达工具包。
编译器和库的环境变量。有关更多信息,请参见第三方硬件而且设置必备产品s manbetx 845.
检查GPU环境
要验证运行此示例所需的编译器和库是否已正确设置,请使用coder.checkGpuInstall
函数。
envCfg = code . gpuenvconfig (“主机”);envCfg。BasicCodegen = 1;envCfg。安静= 1;coder.checkGpuInstall (envCfg);
曼德尔勃特集合
曼德尔布罗特集是复平面上由这些值组成的区域它的轨迹由
保持在.Mandelbrot集合的整体几何如图所示。这个视图没有分辨率来显示集合边界外丰富的细节结构的边缘。
定义输入区域
选择一组限制,指定曼德尔布罗特集的高度放大部分,该部分位于主心脏线和它左边的灯泡。一个1000 x1000
网格的而且在这两个极限之间创建。然后在每个网格位置迭代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.kernelfun
pragma,它尝试在这个函数中并行所有的计算,然后将其映射到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);轴从