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
で、すべての虚数部がゼロの場合、虚数部は保持されてデータは複素数のままになります。これにより、sort
や isreal
などを使用してデータに対して演算を行う際に、不要な計算が実行される可能性があります。
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 |