主要内容

GPU代码生成:Mandelbrot集

这个例子展示了如何使用GPU编码器™从一个简单的MATLAB®函数生成CUDA®代码。Mandelbrot集的实现使用标准MATLAB命令作为入口点函数。本示例使用Codegen.命令,生成运行在GPU上的MEX函数。您可以运行MEX函数来检查运行时错误。

第三方的先决条件

要求

这个例子生成CUDA MEX,并具有以下第三方要求。

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

可选的

对于非mex构建,如静态、动态库或可执行文件,本例有以下附加要求。

验证GPU环境

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

envCfg = coder.gpuEnvConfig(“主机”);envCfg.BasicCodegen = 1;envCfg.Quiet = 1;coder.checkGpuInstall(envCfg);

Mandelbrot集

Mandelbrot集是在复平面组成的值的区域z_0美元的量,通过轨迹定义

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

保持有界$ķ\ RIGHTARROW \ infty $。Mandelbrot集的整体几何结构如图所示。这种观点不具有分辨率只显示外边缘的细节丰富的结构设定的边界。

定义输入地区

挑一组在主心和之间的谷指定Mandelbrot集的高度放大部分限制p / q美元灯泡其左。一种1000×1000网格的$重新\ {X \} $$林\ {Y \} $在这两个极限之间产生。曼德尔布罗算法然后在每个网格位置重复。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入口点函数包含曼德尔布罗的矢量实现设置的基础上的电子书提供的代码与MATLAB实验由克里夫硅藻土。codegen指令打开MATLAB进行代码生成错误检查。当GPU编码器遇到coder.gpu.kernelfunpragma,它尝试并行化这个函数中的所有计算,然后将它映射到GPU。

类型mandelbrot_count
函数count = mandelbrot_count(maxIterations,XGRID,YGRID)%#代码生成%版权所有2016年至2019年MathWorks公司Z0 = XGRID + 1I * YGRID;计数=酮(大小(Z0));%计算映射到GPU。coder.gpu.kernelfun;Z = Z0;。对于n = 0:maxIterations Z = Z * Z + Z 0;内部= ABS(Z)<= 2;计数=计数+内部;结束计数=日志(计数);

测试功能mandelbrot_count

跑过mandelbrot_count函数使用以前生成的xGrid、yGrid值,然后绘制结果。

计数= mandelbrot_count(maxIterations,XGRID,YGRID);图(2),于imagesc(X,Y,计数);Colormap ([jet();flipud(jet());0 0 0]);标题(“Mandelbrot集在MATLAB”);轴

生成CUDA MEX的功能

要生成CUDA MEXmandelbrot_count命令,创建图形处理器代码配置对象,并运行Codegen.命令。由于CPU和GPU之间的架构差异,数字验证并不总是一致。在您的MATLAB代码使用单一的数据类型和这些单个数据类型值进行累加运算时,这种情况是真实的。像这样的例子曼德尔布罗甚至双数据类型将导致数字错误。对于这种不匹配的原因之一是,GPU的浮点单元采用融合浮点乘加(FMAD)指令和CPU不使用这些指令。这FMAD = FALSE传递给选项NVCC编译器关闭此FMAD优化。

CFG = coder.gpuConfig('MEX');cfg.GpuConfig.CompilerFlags =“——fmad = false”;Codegen.-configCFG-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上”);轴

也可以看看

应用

职能

对象

相关的话题