ドキュメンテーション

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

GPU での組み込み関数の実行

gpuArray 引数をもつ MATLAB 関数

多くの MATLAB® 組み込み関数は、gpuArray 入力引数をサポートします。少なくとも 1 つの gpuArray を入力引数としてこれらの関数のいずれかを呼び出すと、常に GPU で実行され、結果として gpuArray を生成します。同一の関数呼び出しの gpuArray と MATLAB 配列の両方を使用して入力を混在させることができ、MATLAB 配列は、関数の実行のために GPU に転送されます。サポート関数には、離散フーリエ変換 (fft)、行列の乗算 (mtimes) および行列の左除算 (mldivide) があります。

以下の関数と記号演算子は、gpuArray の入力引数を受け入れて GPU で実行されるように拡張されています。

個々の関数の更新内容については、リリース ノートを参照してください。

gpuArray オブジェクトに対するこれらの関数のサポートの制限についての情報を確認するには、以下のように入力します。

help gpuArray/functionname

たとえば、lu のオーバーロードについてのヘルプを表示するには、次のように入力します。

help gpuArray/lu

ほとんどの場合、これらの関数のいずれかの入力引数が gpuArray であれば、出力される配列も gpuArray になります。出力が常にスカラーの場合は、ワークスペース内の MATLAB データして返されます。結果が複素数データからなる gpuArray で、すべての虚数部がゼロの場合、虚数部は保持されてデータは複素数のままになります。これは sortisreal などを使用するときに影響する可能性があります。

例: gpuArray 入出力のある関数

次の例では、関数 fft および real を算術演算子 + および * と共に使用します。すべての計算は GPU で実行され、gather によりデータが GPU から MATLAB ワークスペースに返送されます。

Ga = rand(1000,'single','gpuArray');
Gfft = fft(Ga); 
Gb = (real(Gfft) + Ga) * 6;
G = gather(Gb);

whos コマンドは各変数のデータの保存先を表示するよう指示します。

whos
 Name       Size         Bytes  Class

 G       1000x1000     4000000  single
 Ga      1000x1000         108  gpuArray
 Gb      1000x1000         108  gpuArray
 Gfft    1000x1000         108  gpuArray

関数 gather の結果である G を除いて、すべての配列が GPU (gpuArray) に格納されていることに注意してください。

GPU 上のスパース配列

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

abs
angle
bicgstab
ceil
classUnderlying
conj
ctranspose
deg2rad
end
expm1
find
fix
floor
full
gmres
gpuArray.speye
imag
isaUnderlying
isempty
isequal
isequaln
isfloat
isinteger
islogical
isnumeric
isreal
issparse
length
log1p
minus
mtimes
ndims
nextpow2
nnz
nonzeros
numel
nzmax
pcg
plus
rad2deg
real
realsqrt
round
sign
size
sparse
spfun
spones
sqrt
sum
transpose
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 で実行される関数の出力が複素数になる可能性がある場合は、明示的に入力引数を複素数として指定しなければなりません。これは gpuArray や、arrayfun で実行されるコードで呼び出される関数に適用されます。

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

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

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

関数実数出力のための入力範囲
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

この情報は役に立ちましたか?