主要内容

GPU代码生成:Mandelbrot Set

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

第三方先决条件

必需的

此示例生成CUDA MEX并具有以下第三方要求。

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

可选的

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

验证GPU环境

要验证运行此示例所需的编译器和库是否正确设置,请使用Coder.CheckGPuInstall.功能。

envcfg = coder.gpuenvconfig('主持人');Envcf​​g.basicCodegen = 1;Envcf​​g.quiet = 1;Coder.CheckGpuInstall(Envcf​​g);

Mandelbrot Set.

Mandelbrot Set是由值组成的复平面中的区域$ z_0 $对于哪些轨迹定义

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

保持束缚$ k \ lightarrow \ infty $。Mandelbrot集的整体几何形状如图所示。此视图没有分辨率,以显示在集合边界之外的条纹的丰富详细结构。

定义输入区域

选择一套限制,指定主要心皮和主题之间的谷的高度缩放部分$ p / q $灯泡到左边。一种1000x1000格栅$ re \ {x \} $$ im \ {y \} $在这两个限制之间创建。然后在每个网格位置迭代Mandelbrot算法。迭代号为500足以以完全分辨率呈现图像。

最大= 500;gridsize = 1000;XLIM = [-0.748766713922161,-0.7487667077771757];ylim = [0.12364084894862,0.123640851045266];x = Linspace(XLIM(1),XLIM(2),网格化);y = linspace(ylim(1),ylim(2),gridsize);[Xgrid,Ygrid] = meshgrid(x,y);

Mandelbrot入口点函数

mandelbrot_count.m.入口点函数包含基于电子书中提供的代码的Mandelbrot集的矢量化实现Matlab的实验通过封口。%#codegen指令打开MATLAB以进行代码生成错误检查。当GPU编码器遇到时coder.gpu.kernelfun.Pragma,它试图并行化此功能中的所有计算,然后将其映射到GPU。

类型mandelbrot_count.
函数count = mandelbrot_count(maxIrtations,xgrid,ygrid)%#codegen%2016-2019 Mathworks,Inc.Z0 = XGrid + 1i * Ygrid;count = =(大小(z0));%将计算到GPU。coder.gpu.kernelfun;z = z0;对于n = 0:maxIritations z = z。* z + z0;内部= abs(z)<= 2;count =内部计数+;结束count = log(count);

测试功能mandelbrot_count.

跑过mandelbrot_count.使用先前生成的XGrid,yGrid值,然后绘制结果。

count = mandelbrot_count(maxIrtations,Xgrid,Ygrid);图(2),imagec(x,y,count);Colormap([Jet(); Flipud(Jet()); 0 0 0]);标题('Mandelbrot on matlab');轴离开

为该功能生成CUDA MEX

为此产生CUDA MEXmandelbrot_count.函数,创建GPU代码配置对象并运行Codegen.命令。由于CPU和GPU之间的架构差异,数字验证并不总是匹配。在MATLAB代码中使用单个数据类型并对这些单个数据类型值执行累积操作时,此方案是真的。与此Mandelbrot示例一样,即使是双数据类型也会导致数字错误。这种不匹配的一个原因是GPU浮点单元使用融合浮点数 - 添加(FMAD)指令,CPU不使用这些指令。这fmad = false.通过它传递给的选项NVCC.编译器关闭此FMAD优化。

cfg = coder.gpuconfig('mex');cfg.g.guconfig.compilerflags =.'--fmad = false';Codegen.-Config.CFG.-  args.{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上设置');轴离开

也可以看看

应用

功能

对象

相关话题