使用支持 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