我注意到大型复杂阵列在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中的错误吗?
答案 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内存,复制......