此示例显示如何通过使用GPU编码器™从简单的MATLAB®功能生成CUDA®代码。使用标准MATLAB命令的Mandelbrot Set实现充当入门点函数。这个例子使用了codegen
命令生成在GPU上运行的MEX函数。您可以运行MEX函数以检查运行时错误。
必需的
本例生成CUDA MEX,并具有以下第三方需求。
CUDA支持NVIDIA®GPU和兼容驱动程序。
可选
对于诸如静态,动态库或可执行文件的非MEX构建,此示例具有以下附加要求。
英伟达工具包。
编译器和库的环境变量。有关更多信息,请参见第三方硬件和设置前提产品s manbetx 845.
要验证运行此示例所需的编译器和库是否正确设置,请使用Coder.CheckGPuInstall.
函数。
envCfg = coder.gpuEnvConfig ('主持人');envCfg。BasicCodegen = 1;envCfg。安静= 1;coder.checkGpuInstall (envCfg);
曼德尔勃洛特集是复平面中由这些值组成的区域它的轨迹由
保持束缚.Mandelbrot集合的整体几何结构如图所示。这个观点没有分辨率显示丰富详细的结构边缘的边界以外的集合。
选择一组限制,指定在主心脏线和心脏线之间的谷中曼德尔布罗特集的高度放大部分灯泡在它的左边。一个1000 x1000
格栅和是在这两个极限之间产生的。然后在每个网格位置迭代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_count.m
入口点函数包含一个基于电子书中提供的代码的Mandelbrot集的向量化实现与MATLAB实验通过封口。%#codegen指令打开MATLAB以进行代码生成错误检查。当GPU编码器遇到时coder.gpu.kernelfun
Pragma,它试图并行化此功能中的所有计算,然后将其映射到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 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函数后,验证它是否具有与原始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上设置');轴离开