解释从输入到具有复杂结果的 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 以这种方式运行。
考虑这行代码:
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 以这种方式运行。