GPU memory usage for Hadamard product
6 次查看(过去 30 天)
显示 更早的评论
I have a GPU with 48 Gb of RAM.
I have a large matrix A (complex single 45927x45927, gpuArray) taking 16 Gb of my GPU.
I get to the following Hadamard product with a vector B (complex single 45927x1, gpuArray) with approximately 28 Gb of free RAM on the GPU:
C = A .* (B.')
But this throws an "out of memory on the device" error, despite there being enough memory for C (also 16 Gb). Why is this happening? Does MATLAB implicitly convert B to a full matrix? Is there a way to get this multiplication to work on the GPU within the available memory? (maybe this has been fixed in later releases of MATLAB?)
回答(4 个)
Sivsankar
2024-7-12
Hi,
I believe that you are probably limited by the size of RAM of your GPU. I can suggest some ideas that you can implement which may work.
- Upgrade to the latest version of MATLAB.
- Pre-allocate the memory for the resultant gpuArray matrix C.
- Clear any existing gpuArray that may take up the RAM.
- Reset GPU device to release memory.
You can leverage this MATLAB answer that highlights a similar issue.
You can also make use of this MathWorks documentation that explains on how to resolve such “out of memory” errors.
Hope this works for you. Thanks.
Matt J
2024-7-14
This is just a guess, but possibly the GPU memory is fragmented. I.e., maybe your available 28GB is broken into blocks that are smaller than 16GB and therefore Matlab cannot find enough space to allocate C.
0 个评论
Catalytic
2024-7-14
编辑:Catalytic
2024-7-14
Does MATLAB implicitly convert B to a full matrix?
When you say this, are you implying that issparse(B)=true? If so, then it is possible that C could consume up to 32 GB.
2 个评论
Matt J
2024-7-14
I don't think that would be possible. If B were sparse, you would get a different error if you tried to multiply it with a single matrix.
Joss Knight
2024-7-18
编辑:Joss Knight
2024-7-18
I can't reproduce this.
You say you have 48Gb of GPU memory available...have you checked this? Try running gpuDevice and looking at the output. Maybe you have other variables taking up space. Maybe you have another MATLAB running and using the GPU?
Also, did it work the first time you ran it but not the second? If C already exists then you would need space for A, C and the new C all at once, and you would run out of memory.
3 个评论
Joss Knight
2024-7-18
Your gpuDevice output seems to indicate you have quite an old version of MATLAB. What version are you on?
Joss Knight
2024-7-18
Never mind. I can't reproduce this in any old version, on Linux or Windows.
Just to be sure, make sure your script is standalone and is the only thing you run after you've started MATLAB. It should contain no other computation than creating A and B and then computing C, so for instance:
n = 45927;
proto = gpuArray(single(1i));
A = randn(n,'like',proto);
B = randn(n,1,'like',proto);
C = A.*(B.');
gpuDevice
whos
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 GPU Computing in MATLAB 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!