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

标签 matlab memory-management gpgpu complex-numbers gpuarray

考虑这行代码:

gpuArray(-1)^0.5;

结果是:

ans =
   0.0000 + 1.0000i

Now consider the following line of code:

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)?操作系统的?

最佳答案

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

完全有可能编写一个实现,例如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 函数告诉您的是存储,而不是)。

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

关于matlab - 解释从输入到具有复杂结果的 GPU 计算的要求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53091818/

相关文章:

performance - 更快地连接不同大小的元胞数组

matlab - 我如何测量函数在 Matlab 中运行的时间?

matlab - 缓慢的匿名函数

delphi - 使用Delphi来利用GPGPU技术?

gpgpu - 从 arrayfire 数组中检索值作为标准类型和序列化

Matlab-Arduino 实时绘图

java - java for循环的效率

java - C++11、C#和Java内存模型的区别

c - C编程内存复制和删除失败

CUDA:每个多处理器线程和每个 block 线程的区别是什么?