解释从输入到具有复杂结果的 GPU 计算的要求

Explanation of requirement from inputs to GPU computations having complex results

考虑这行代码:

gpuArray(-1)^0.5;

这导致:

ans =
   0.0000 + 1.0000i

现在考虑以下代码行:

gpuArray(-1).^0.5;

这导致:

Error using  .^ 
POWER: needs to return a complex result, but this is not supported for real input X and Y on 
the GPU. Use POWER(COMPLEX(X), COMPLEX(Y,0)) instead. 

问题显然与 GPU 上的 double -> complex double 转换有关,这是不允许的。事实上,当我应用解决方法(docs 中也提到)时,它解决了问题 - 但我不明白为什么。

有人能解释一下吗?这是 VRAM 的一些限制吗?我正在使用的特定卡(我的是 GTX 660,CC 为 3.0)? MATLAB 实现(我使用的是 R2018b)? OS?

有几个 gpuArray 的方法是这样的,原因很简单:性能。

完全有可能编写一个实现,例如sqrt 在 GPU 上的行为与 MATLAB 的 CPU 实现的工作方式相同(即计算真实结果,除非需要复杂的结果 - 在这种情况下,return 是一个复杂的结果)。部分工作已经执行 - 否则 gpuArray 方法将不知道何时抛出错误。然而,昂贵的部分是重新分配(复杂的)输出,并再次执行操作。

还有一些与 gpuArray 和复数有关的其他轻微的怪癖 - 在 GPU 上,当 MATLAB CPU 实现将删除它们时,全零虚部不会被删除。例如:

>> a = [1i, 2]; gA = gpuArray(a);
>> [isreal(a(2)), isreal(gA(2))]
ans =
  1×2 logical array
   1   0

(当然要记住 MATLAB 的 isreal 函数告诉你的是 storage,而不是 values)。

编辑: 刚刚意识到 gpuArray 的函数有一个 specific doc reference 以这种方式运行。