主要内容

GPU代码生成:Mandelbrot Set

这个例子展示了如何使用GPU编码器™从一个简单的MATLAB®函数生成CUDA®代码。Mandelbrot集的实现使用标准MATLAB命令作为入口点函数。本示例使用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.命令,创建图形处理器代码配置对象,并运行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.{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上”);轴

也可以看看

应用

职能

对象

相关的话题