主要内容

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

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

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

定义参数。曼德布洛特算法在实部和虚部网格上进行迭代。以下代码定义了迭代次数、网格大小和网格限制。

maxIterations = 500;
gridSize = 1000;
xlim = [-0.748766713922161, -0.748766707771757];
ylim = [ 0.123640844894862,  0.123640851045266]; 

您可以使用 gpuArray函数将数据传输到 GPU 并创建 gpuArray,也可以直接在 GPU 上创建数组。gpuArray 提供了许多函数的 GPU 版本,您可以使用它们来创建数据数组,例如 linspace。有关详细信息,请参阅直接创建 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         1x1000             8000  gpuArray              
  y         1x1000             8000  gpuArray              

许多 MATLAB 函数支持 gpuArrays。当您向任何启用 GPU 的函数提供 gpuArray 参量时,该函数会在 GPU 上自动运行。有关详细信息,请参阅在 GPU 上运行 MATLAB 函数。为算法创建一个复杂的网格,并为结果创建数组 count。要直接在 GPU 上创建此数组,请使用 ones 函数,并指定 'gpuArray'

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

以下代码使用支持 GPU 的函数实现曼德布洛特算法。因为代码使用了 gpuArrays,所以计算发生在 GPU 上。

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

计算完成后,绘制结果。

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

另请参阅

| |

主题