为什么复杂的Matlab gpuArray占用的内存是它应该的两倍?

时间:2014-04-03 16:34:33

标签: matlab gpu

我注意到大型复杂阵列在GPU上占用的内存是在CPU上的两倍。

这是一个最小的例子:

%-- First Try: Complex Single
gpu = gpuDevice(1);
m1 = gpu.FreeMemory;
test = complex(single(zeros(600000/8,1000)));  % 600 MByte complex single
whos('test')
test = gpuArray(test);
fprintf(' Used memory on GPU: %e\n', m1-gpu.FreeMemory);

现在我用两倍大的数组做同样的事情,这个数组并不复杂:

%-- Second Try:, Single
gpu = gpuDevice(1);
m1 = gpu.FreeMemory;
test = single(zeros(600000/4,1000));  % 600MB MByte real single
whos('test')
test = gpuArray(test);
fprintf(' Used memory on GPU: %e\n', m1-gpu.FreeMemory);

输出结果为:

 Name          Size                  Bytes  Class     Attributes    
 test      75000x1000            600000000  single    complex   
 Used memory on GPU: 1.200095e+09

 Name           Size                  Bytes  Class     Attributes   
 test      150000x1000            600000000  single                  
 Used memory on GPU: 6.000476e+08

在CPU上,两个阵列都是600MB - 在GPU上,复杂阵列使用1.2 GByte。 我使用Matlab 2013a在两块显卡上进行了测试:GeForce GTX 680和Tesla K20。

我该如何避免这种情况?这是Matlab中的错误吗?

1 个答案:

答案 0 :(得分:1)

MATLAB central回答了这个问题。总结MathWorks开发人员Edric Ellis的回答:

  • gpu.FreeMemory可能无法准确衡量可用的GPU内存,因为MATLAB在使用它时不会立即释放内存。 gpu.AvailableMemory可以更准确地衡量可用内存。

  • 将复杂数据传输到GPU或从GPU传输复杂数据仍然需要2倍的内存,因为在GPU上进行了格式转换。具体来说,CPU主机内存中的复杂数组存储时,实/虚部分分为2个独立的向量,而GPU设备上的复杂数组则以交错格式存储。

在R2017a上进行测试,我确认:

  • gpu.FreeMemory切换到gpu.AvailableMemory确实解决了导致原始问题的报告内存使用情况的差异。

  • 使用8 GB的GPU内存,复制......

    • 6 GB实阵:成功
    • 6 GB复杂数组:"设备内存不足"错误
    • 6个独立的1 GB复杂数组:成功
相关问题