Work with Complex Numbers on a GPU
Conditions for Working With Complex Numbers on a GPU
If the output of a function running on a GPU could potentially be complex, you must explicitly specify its input arguments as complex using the complex
function. This applies to functions operating on gpuArray
objects directly and to functions operating on gpuArray
data using arrayfun
.
When creating a gpuArray
that has negative elements, use G = gpuArray(complex(x))
, then you can successfully execute sqrt(G)
. For example,
x = [-1 0 1]; G = gpuArray(complex(x)); rootG = sqrt(G)
0.0000 + 1.0000i 0.0000 + 0.0000i 1.0000 + 0.0000i
If the result is a gpuArray
of complex data and all the imaginary parts are zero, these parts are retained and the data remains complex. This could result in unnecessary calculations being performed when operating on the data using, for example, sort
and isreal
.
If using arrayfun
, the function input can be specified as complex within the arrayfun
call. For example,
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
Functions That Return Complex Data
This table lists the functions that might return complex data, along with the input range over which the output remains real.
Function | Input Range for Real Output |
---|---|
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 |