ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

GPU での MATLAB 関数の実行

gpuArray 引数をもつ MATLAB 関数

MATLAB® および他のツールボックスの数百もの関数は gpuArray 引数を渡すことで自動的に GPU で実行されます。

A = gpuArray([1 0 1; -1 -2 0; 0 1 -1]);
e = eig(A);

少なくとも 1 つの gpuArray をデータ入力引数としてこれらの関数を呼び出すたびに、その関数が GPU で実行されます。関数は結果として gpuArray を生成します。ただし、MATLAB データを返すことがより適切である場合を除きます (例: size)。同じ関数呼び出しで gpuArray と MATLAB 配列の両方を使用して、入力を混在させることができます。GPU または CPU で関数が実行されるタイミングの詳細については、gpuArray 入力の特殊な条件を参照してください。GPU 対応の関数には、離散フーリエ変換 (fft)、行列乗算 (mtimes)、行列の左除算 (mldivide)、および数百のその他の関数があります。

GPU をサポートする関数の確認

MATLAB 関数が GPU をサポートしている場合、その関数のページで GPU の使用に関する追加情報を参照できます。関数ページの最後にある「拡張機能」節の「GPU 配列」を参照してください。

また、関数の GPU サポートを閲覧し、製品別にフィルター処理することもできます。[ヘルプ] バーで [関数] をクリックし、製品を選択します。関数リストの左ペイン下部で、[GPU 配列] を選択します。

個々の GPU 対応関数の更新の詳細については、リリース ノートを参照してください。

GPU のチェックまたは選択

GPU がある場合、MATLAB は自動的に GPU での計算に使用します。関数 gpuDevice を使用して GPU をチェックできます。複数の GPU がある場合は、gpuDevice を使用してその 1 つを選択するか、並列プールで複数の GPU を使用することができます。例は、GPU の識別と選択並列プールにおける複数の GPU の使用を参照してください。GPU がサポートされていることをチェックするには、リリース別の GPU サポートを参照してください。

深層学習向けに、MATLAB は複数の GPU の自動並列処理をサポートしています。MATLAB による複数の GPU での深層学習 (Deep Learning Toolbox)を参照してください。

GPU での MATLAB 関数の使用

この例では、GPU 対応の MATLAB 関数を使用して gpuArray を処理する方法を説明します。関数gpuDeviceを使用して GPU をチェックしてください。

行ベクトルを作成します。GPU に転送して gpuArray を作成するには、関数gpuArrayを使用します。

range = [-15:15 0 -15:15 0 -15:15];
n = gpuArray(range);
whos n
  Name      Size            Bytes  Class       Attributes

  n         1x95                4  gpuArray              

gpuArray を処理するには、GPU 対応の MATLAB 関数を使用します。MATLAB は自動的に計算を GPU で実行します。詳細については、GPU での MATLAB 関数の実行を参照してください。たとえば、diagexpmmodabs、および fliplr を組み合わせて使用します。

E = expm(diag(n,-1)) * expm(diag(n,1));
M = mod(abs(E),2);
F = M + fliplr(M);

次に、結果をプロットします。

imagesc(F);
colormap(flip(gray));

GPU からデータを転送して収集する必要がある場合は、gather を使用します。CPU への収集は高コストの可能性があるため、gpuArray をサポートしていない関数で結果を処理する必要がある場合を除いて、一般的に収集は不要です。

result = gather(F);
whos result
  Name         Size            Bytes  Class     Attributes

  result      96x96            73728  double              

GPU を使用したイメージのシャープ化

この例では、gpuArray と GPU 対応関数を使用してイメージをシャープ化する方法を説明します。

関数gpuArrayを使用してイメージを読み取り、GPU に送信します。

image = gpuArray(imread('peppers.png'));

イメージを double に変換し、畳み込みを適用してグラデーション イメージを取得します。次に、そのグラデーション イメージを使用して、イメージを係数 amount でシャープ化します。

dimage = im2double(image); 
gradient = convn(dimage,ones(3)./9,'same') - convn(dimage,ones(5)./25,'same');
amount = 5;
sharpened = dimage + amount.*gradient;

元のイメージとシャープ化したイメージをリサイズしてプロットし、比較します。

imshow(imresize([dimage, sharpened],0.7));
title('Original image (left) vs sharpened image (right)');

GPU 対応関数を使用したマンデルブロ集合の計算

この例では、GPU 対応の MATLAB 関数を使用して、有名な数学的構成であるマンデルブロ集合を計算する方法を説明します。関数gpuDeviceを使用して GPU をチェックしてください。

パラメーターを定義します。実数部および虚数部のグリッド上にマンデルブロ アルゴリズムが反復されます。次のコードは反復回数、グリッド サイズおよびグリッドの範囲を定義します。

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

関数gpuArrayを使用してデータを GPU に転送し、gpuArray を作成できます。また、GPU 上で直接配列を作成することもできます。gpuArray linspace などのデータ配列を作成するために使用できる多くの関数の GPU バージョンを提供します。詳細については、GPU 配列の直接作成を参照してください。

x = gpuArray.linspace(xlim(1),xlim(2),gridSize);
y = gpuArray.linspace(ylim(1),ylim(2),gridSize);
whos a b

多くの 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 対応関数を使用してマンデルブロ アルゴリズムを実装しています。このコードは gpuArray を使用しているため、計算は 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

GPU 上でのスパース配列の処理

次の関数はスパースな gpuArray をサポートします。

abs
angle
bicg
bicgstab
ceil
cgs
classUnderlying
conj
ctranspose
deg2rad
end
expm1
find
fix
floor
full
gmres
gpuArray.speye
imag
isaUnderlying
isdiag
isempty
isequal
isequaln
isfloat
isinteger
islogical
isnumeric
isreal
issparse
istril
istriu
length
log1p
lsqr
minus
mtimes
ndims
nextpow2
nnz
nonzeros
norm
numel
nzmax
pcg
plus
rad2deg
real
realsqrt
round
sign
size
sparse
spfun
spones
sprandsym
sqrt
sum
transpose
tril
triu
uminus
uplus  

gpuArray 入力を指定して sparse を呼び出すか、スパース入力を指定して gpuArray を呼び出すことでスパースな gpuArray を作成できます。以下に例を示します。

x = [0 1 0 0 0; 0 0 0 0 1]
     0     1     0     0     0
     0     0     0     0     1
s = sparse(x)
   (1,2)        1
   (2,5)        1
g = gpuArray(s);   % g is a sparse gpuArray
gt = transpose(g); % gt is a sparse gpuArray
f = full(gt)       % f is a full gpuArray
     0     0
     1     0
     0     0
     0     0
     0     1

GPU 上での複素数の処理

GPU で実行される関数の出力が複素数になる可能性がある場合は、明示的に入力引数を複素数として指定しなければなりません。これは gpuArray や、arrayfun で実行されるコードで呼び出される関数に適用されます。

たとえば、負の要素をもつ可能性がある gpuArray を作成する場合は、G = gpuArray(complex(p)) を使用すると、sqrt(G) を正常に実行できます。

あるいは、arrayfun に渡される関数において、x が実数を成分とするベクトルであり一部の要素が負の値をとる場合、sqrt(x) はエラーを生成します。代わりに sqrt(complex(x)) を呼び出してください。

結果が複素数データからなる gpuArray で、すべての虚数部がゼロの場合、虚数部は保持されてデータは複素数のままになります。これは sortisreal などを使用するときに影響する可能性があります。

次の表に、複素数データを返す可能性がある関数を、出力が実数となる入力範囲と共に記載します。

関数実数出力のための入力範囲
acos(x)abs(x) <= 1
acosh(x)x >= 1
acoth(x)abs(x) >= 1
acsc(x)abs(x) >= 1
asec(x)abs(x) >= 1
asech(x)0 <= x <= 1
asin(x)abs(x) <= 1
atanhabs(x) <= 1
log(x)x >= 0
log1p(x)x >= -1
log10(x)x >= 0
log2(x)x >= 0
power(x,y)x >= 0
reallog(x)x >= 0
realsqrt(x)x >= 0
sqrt(x)x >= 0

gpuArray 入力の特殊な条件

GPU 対応関数は、データが GPU 上にある場合にのみ GPU 上で実行されます。たとえば、次のコードはデータ、つまり最初の入力が GPU 上にあるため、GPU 上で実行されます。

>> sum(gpuArray(magic(10)),2);
しかし、次のコードはデータ、つまり最初の入力が GPU 上にないため、GPU 上で実行されません。
>> sum(magic(10),gpuArray(2));
入力引数 gpuArray に次元、スケーリング ファクター、反復回数などの項目が含まれる場合、関数はそれらを収集して CPU 上で計算します。関数は、実際のデータ引数が gpuArray である場合にのみ GPU 上で実行されます。

謝辞

MAGMA は、GPU 高速化を利用する線形代数ルーチンのライブラリです。gpuArray 用として Parallel Computing Toolbox™ に実装された線形代数関数は、MAGMA を利用して高いパフォーマンスと精度を実現しています。

参考

|

関連する例

詳細