在 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 |