3

考虑这行代码:

gpuArray(-1)^0.5;

结果是:

答案=
   0.0000 + 1.0000i

现在考虑以下代码行:

gpuArray(-1).^0.5;

结果是:

使用错误。^
POWER:需要返回一个复杂的结果,但这不支持实际输入 X 和 Y on
显卡。请改用 POWER(COMPLEX(X), COMPLEX(Y,0))。

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

有人会对此有所了解吗?这是 VRAM 的一些限制吗?我正在使用的特定卡(我的是 GTX 660,CC 为 3.0)?MATLAB 的实现(我使用的是 R2018b)?操作系统?

4

1 回答 1

3

有几种方法可以gpuArray做到这一点,原因很简单:性能。

完全可以编写一个 eg 的实现,sqrt它在 GPU 上的行为方式与 MATLAB 的 CPU 实现的工作方式相同(即计算实际结果,除非需要复杂的结果——在这种情况下,返回一个复杂的结果)。部分工作已经完成 - 否则该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

于 2018-11-01T10:12:20.637 回答