主要内容

模板在GPU处理

这个例子展示了如何生成CUDA®内核模板类型操作通过实现由约翰·h·康威“生命游戏”。

“生命游戏”是一个zero-player细胞自动机游戏包括一组细胞(人口)在一个矩形网格(宇宙)。在离散时间细胞进化步骤称为一代又一代。一组数学规则应用于细胞和它的邻居们控制自己的生命,死亡,和繁殖。这个“游戏人生”实现基于示例中提供的电子书与MATLAB实验由克里夫硅藻土。实现遵循这些规则:

  • 细胞排列在一个二维网格。

  • 在每个步骤中,八个最近的邻居的每一个细胞的生命力决定它的命运。

  • 任何细胞到底三个邻居来生活在下一步。

  • 活细胞与两个邻居住在下一步仍活着。

  • 所有其他细胞(包括那些超过三个邻居)死在下一步或保持空的。

这里有一些例子的细胞更新。

许多可以表示为一个数组操作钢网输出数组的操作,每个元素取决于输入数组的小区域。模板3×3的周边地区在这个例子中是每一个细胞。有限的差异,卷积、中值滤波和有限元方法可以执行其他操作,模板处理的例子。

第三方的先决条件

要求

这个示例中生成CUDA墨西哥人,有以下第三方的要求。

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

可选

等non-MEX构建静态、动态库或可执行文件,这个例子有以下额外的需求。

验证GPU环境

验证所需的编译器和库运行这个示例设置正确,使用coder.checkGpuInstall函数。

envCfg = coder.gpuEnvConfig (“主机”);envCfg。BasicCodegen = 1;envCfg。安静= 1;coder.checkGpuInstall (envCfg);

生成一个随机的初始种群

是,游戏zero-player,游戏的进化是由它的初始状态。对于这个示例,创建一个初始种群的细胞在一个二维网格活着大约25%的位置。

gridSize = 500;numGenerations = 100;initialGrid =(兰德(gridSize gridSize) >综合成绩);%画出初始网格显示亮度图像(initialGrid);colormap ([1 1 1; 0 0.5 0]);标题(“初始网格”);

玩游戏的生活

gameoflife_orig.m函数是一个完全的矢量化实现“游戏人生”。功能更新所有的细胞都在他们通过每一个网格生成。

类型gameoflife_orig
% %网格矢量化实现MATLAB函数= gameoflife_orig (initialGrid) % 2016 - 2019版权MathWorks, inc . numGenerations = 100;网格= initialGrid;[gridSize ~] =大小(initialGrid);%循环每一代更新网格和显示它。一代= 1:numGenerations网格= updateGrid(网格,gridSize);显示亮度图像(网格);colormap ([1 1 1; 0 0.5 0]);标题([网格在迭代,num2str(代)]);drawnow;结束函数X = updateGrid (X, N) %指数向量增加或减少集中指数%从而访问一个邻居到左边,,,。 p = [1 1:N-1]; q = [2:N N]; % Count how many of the eight neighbors are alive. neighbors = X(:,p) + X(:,q) + X(p,:) + X(q,:) + ... X(p,p) + X(q,q) + X(p,q) + X(q,p); % A live cell with two live neighbors, or any cell with % three live neighbors, is alive at the next step. X = (X & (neighbors == 2)) | (neighbors == 3); end end

玩游戏通过调用gameoflife_orig函数与一个初始种群。游戏中遍历100代和显示在每一代的人口。

gameoflife_orig (initialGrid);

将GPU的生活游戏代码生成

看的计算updateGrid函数,很明显,同样的操作都是独立应用于每个网格位置。然而,每个单元格必须知道八个邻国。修改后的gameoflife_stencil.m函数使用stencilfun编译指示来计算3 x3的每一个细胞周围地区。模板的GPU编码器™实现内核计算网格的一个元素在每个线程和使用共享内存来提高内存带宽和数据位置。

类型gameoflife_stencil
函数网格= gameoflife_stencil (initialGrid) % # codegen % 2016 - 2019版权MathWorks, inc . numGenerations = 100;网格= initialGrid;%循环每一代更新网格。一代= 1:numGenerations网格= stencilfun (@updateElem、网格(3、3),形状= '同样');结束结束函数X = updateElem窗口(窗口)邻居=(1)+窗口(1、2)+窗口(1、3)…+窗口(2,1)+窗口(2、3)…+窗口(3,1)+窗口(3 2)+窗口(3,3);X =(窗口(2,2)&(邻居= = 2))|(邻居= = 3);结束

生成函数的CUDA墨西哥人

生成CUDA的墨西哥人gameoflife_stencil功能,创建一个GPU代码配置对象,然后使用codegen命令。

cfg = coder.gpuConfig (墨西哥人的);codegen配置cfgarg游戏{initialGrid}gameoflife_stencil
代码生成成功。

函数运行的墨西哥人

运行生成的gameoflife_stencil_mex与随机的初始种群。

gridGPU = gameoflife_stencil_mex (initialGrid);% 100代后画网格显示亮度图像(gridGPU);colormap ([1 1 1; 0 0.5 0]);标题(“最终网格CUDA墨西哥人”);

另请参阅

功能

对象

相关的话题