主要内容

图形处理器代码生成:Mandelbrot集

此示例显示如何通过使用GPU编码器™从简单的MATLAB®功能生成CUDA®代码。使用标准MATLAB命令的Mandelbrot Set实现充当入门点函数。这个例子使用了codegen命令生成在GPU上运行的MEX函数。您可以运行MEX函数以检查运行时错误。

第三方先决条件

必需的

本例生成CUDA MEX,并具有以下第三方需求。

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

可选

对于诸如静态,动态库或可执行文件的非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 $.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.gpu.kernelfunPragma,它试图并行化此功能中的所有计算,然后将其映射到GPU。

类型mandelbrot_count
function count = mandelbrot_count(maxIterations, xGrid, yGrid) %#codegen % Copyright 2016-2019 The MathWorks, Inc. z0 = xGrid + 1i*yGrid;数= 1(大小(z0));将计算映射到GPU。coder.gpu.kernelfun;z = z0;对于n = 0:maxIterations z = z.*z + z0;在= abs (z) < = 2;Count = Count +内部;End count = log(计数);

测试功能mandelbrot_count

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

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

为函数生成CUDA MEX

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

cfg = coder.gpuConfig (墨西哥人的);cfg.GpuConfig.CompilerFlags ='--fmad = false';codegen配置cfgarg游戏{maxIrtations,xgrid,ygrid}mandelbrot_count
代码成功:要查看报告,请打开('codegen / mex / mandelbrot_count / html / export.mldatx')。

运行MEX命令

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

countgpu = mandelbrot_count_mex(maxIrtations,Xgrid,Ygrid);图(2),ImageC(x,y,coungpu);Colormap ([jet();flipud(jet());0 0 0]);标题('Mandelbrot在GPU上设置');轴离开

另请参阅

应用程序

功能

对象

相关话题