GPU 対応関数を使用したマンデルブロ集合の計算
この例では、GPU 対応の MATLAB® 関数を使用して、有名な数学的構成であるマンデルブロ集合を計算する方法を説明します。
実数部および虚数部のグリッド上にマンデルブロ アルゴリズムが反復されます。反復回数、グリッド サイズおよびグリッドの範囲を定義します。次の値は、マンデルブロ集合を大きくズームした部分を指定します。
maxIterations = 5000; gridSize = 2000; xLim = [-0.777120613150274 -0.777120273471042]; yLim = [ 0.126857111509958 0.126857366062765];
GPU 上で線形に等間隔の 2 つのベクトルを直接作成するには、gpuArray.linspace 関数を使用します。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
MATLAB および他のツールボックスの関数の多くは、gpuArray データ引数を指定すると、自動的に 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