メインコンテンツ

GPU 上での複素数の処理

MATLAB® の複素数を扱う関数や複素数を返す関数の多くは、GPU を使用して高速化できます。このページでは、複素数を扱う場合やデータが gpuArray である場合に認識しておく必要がある条件について説明します。代わりに MATLAB で実行されるカスタム CUDA® コードで複素数データを扱う場合の詳細については、CUDA コードを含む MEX 関数の実行を参照してください。

GPU 上での複素数の処理条件

GPU で実行される関数の出力が複素数になる可能性がある場合は、関数 complex を使用して、明示的に入力引数を複素数として指定しなければなりません。これは、gpuArray オブジェクトに対して直接演算を行う関数と、arrayfun を使用して gpuArray データに対して演算を行う関数に適用されます。

たとえば、G が負の要素を含む gpuArray である sqrt(G) を正しく計算するには、G を複素数として指定します。

x = [-1 0 1];
G = gpuArray(complex(x));
rootG = sqrt(G)
   0.0000 + 1.0000i   0.0000 + 0.0000i   1.0000 + 0.0000i

結果が複素数データからなる gpuArray で、すべての虚数部がゼロの場合、虚数部は保持されてデータは複素数のままになります。これにより、sortisreal などを使用してデータに対して演算を行う際に、不要な計算が実行される可能性があります。

出力が複素数になる可能性がある関数を arrayfun を使用して適用する場合は、arrayfun の呼び出し内で関数入力を複素数として指定します。

x = [-1 0 1];
G = gpuArray(x);
A = arrayfun(@(p) sqrt(complex(p)),G)
   0.0000 + 1.0000i   0.0000 + 0.0000i   1.0000 + 0.0000i

複素数データを返す関数

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

関数実数出力のための入力範囲
acos, acosdabs(x) <= 1
acoshx >= 1
acothabs(x) >= 1
acsc, acscdabs(x) >= 1
asec, asecdabs(x) >= 1
asech0 <= x <= 1
asin, asindabs(x) <= 1
atanhabs(x) <= 1
logx >= 0
log1px >= -1
log10x >= 0
log2x >= 0
powerx >= 0
sqrtx >= 0

参考

|

トピック