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