Main Content

GPU 上での複素数の処理

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

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

負の要素をもつ gpuArray を作成する場合は、G = gpuArray(complex(x)) を使用すると、sqrt(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(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
atanh(x)abs(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

参考

|

関連するトピック