这个例子展示了如何使用GPU编码器™从一个简单的MATLAB®函数生成CUDA®代码。Mandelbrot集的实现使用标准MATLAB命令作为入口点函数。本示例使用Codegen.
命令,生成运行在GPU上的MEX函数。您可以运行MEX函数来检查运行时错误。
要求
这个例子生成CUDA MEX,并具有以下第三方要求。
支持CUDA的NVIDIA GPU和兼容的驱动程序。
可选的
对于非mex构建,如静态、动态库或可执行文件,本例有以下附加要求。
NVIDIA工具包。
环境变量的编译器和库。有关更多信息,请参阅第三方硬件和设置前提条件的产品下载188bet金宝搏。
要验证运行此示例所需的编译器和库是否正确设置,请使用coder.checkGpuInstall
功能。
envCfg = coder.gpuEnvConfig(“主机”);envCfg.BasicCodegen = 1;envCfg.Quiet = 1;coder.checkGpuInstall(envCfg);
Mandelbrot集是在复平面组成的值的区域的量,通过轨迹定义
保持有界。Mandelbrot集的整体几何结构如图所示。这种观点不具有分辨率只显示外边缘的细节丰富的结构设定的边界。
挑一组在主心和之间的谷指定Mandelbrot集的高度放大部分限制灯泡其左。一种1000×1000
网格的和在这两个极限之间产生。曼德尔布罗算法然后在每个网格位置重复。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
入口点函数包含曼德尔布罗的矢量实现设置的基础上的电子书提供的代码与MATLAB实验由克里夫硅藻土。codegen指令打开MATLAB进行代码生成错误检查。当GPU编码器遇到coder.gpu.kernelfun
pragma,它尝试并行化这个函数中的所有计算,然后将它映射到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 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函数后,验证它与原始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上”);轴从