主要内容

本页采用了机器翻译。点击此处可查看英文原文。

使用支持 GPU 的函数计算曼德布洛特集

此示例展示了如何使用支持 GPU 的 MATLAB® 函数来计算著名的数学构造:曼德布洛特集。

曼德布洛特算法在实部和虚部网格上进行迭代。设定迭代次数、网格大小和网格边界。这些值用于指定曼德布罗集的一个高度放大的部分。

maxIterations = 5000;
gridSize = 2000;

xLim = [-0.777120613150274 -0.777120273471042];
yLim = [ 0.126857111509958  0.126857366062765];

使用 gpuArray.linspace 函数直接在 GPU 上生成两个线性间隔的向量。与其直接在 GPU 上生成数据,您也可以使用 gpuArray 函数将现有数据传输到 GPU。有关详细信息,请参阅直接创建 GPU 数组

x = gpuArray.linspace(xLim(1),xLim(2),gridSize);
y = gpuArray.linspace(yLim(1),yLim(2),gridSize);
whos x y
  Name      Size              Bytes  Class       Attributes

  x         1x2000            16000  gpuArray              
  y         1x2000            16000  gpuArray              

如果您提供 gpuArray 数据参量,MATLAB 和其他工具箱中的许多函数都会在 GPU 上自动运行。有关详细信息,请参阅在 GPU 上运行 MATLAB 函数

为算法创建一个复杂的网格,并为结果创建数组 count。要在 GPU 上直接创建此数组,请使用 ones 函数,并将输出类指定为 "gpuArray"

[xGrid,yGrid] = meshgrid(x,y);
z0 = complex(xGrid,yGrid);
gridSize = size(z0);
count = ones(gridSize,"gpuArray");

使用支持 GPU 的函数实现曼德尔布罗特算法。这是基于 Cleve Moler 的 Experiments with MATLAB 电子书中提供的代码。由于该代码使用了 GPU 数组,因此计算是在 GPU 上进行的。

z = z0;

for n = 0:maxIterations
    z = z.*z + z0;
    inside = abs(z) <= 2;
    count = count + inside;
end
count = log(count);

绘制结果。

figure
imagesc(x,y,count)
colormap([jet;flipud(jet);0 0 0]);
axis off

Figure contains an axes object. The hidden axes object contains an object of type image.

另请参阅

| |

主题