Optimize GPU code with nested pagemtimes
4 ビュー (過去 30 日間)
古いコメントを表示
Hello all,
I'm trying to speed up computation using the GPUs that are available to me. Right now I have two arrays, Q and W.
size(W) = (16 1 1000)
size(Q) = (16 16 1 2000)
I want to do a sudo-matrix multiplication M = W ' *Q*W to get size(M) = (1000 2000).
To do this I use two instances of pagemtimes which is able to utilize GPU. Here's the code
%%
tic
Sar_pm_gpu = zeros(num_psar_kept,2,size(shim_pm_gpu,3),'single','gpuArray');
for n =1:size(W,3)
inter_calc = pagemtimes(Q_gpu,shim_pm_gpu(:,1,n));
Sar_this_shim = squeeze(pagemtimes(shim_pm_gpu_left(:,:,n),inter_calc)); %in a test, this one is ~15% faster
[Sar_maxk, index_maxk] = max(Sar_this_shim);
Sar_pm_gpu(:,:,n)=[Sar_maxk,index_maxk];
end
With this code I get ~5x speedup vs running it on the cpu. However I'd expect it to be quite a bit faster than that. I then used nvidia-smi and the power consumption on the GPU was ~35W. For referance the resting power consumption is 30W so I don't think that this code is actually utilizing the GPU. If anyone sees a way to speed this up it would be much appriciated! (a explaination on why the GPU power consumption is so low with this posted code would also be much appriciated, I assume it has something to do with memory)
2 件のコメント
採用された回答
Matt J
2022 年 7 月 28 日
I don't think you need either a loop or a second pagemtimes call.
Wr=reshape(W,16,1000);
Qr=reshape(Q,16,16,2000);
M=sum(pagemtimes(Qr,Wr).*Wr,1);
M=reshape(M,1000,2000);
4 件のコメント
その他の回答 (0 件)
参考
カテゴリ
Help Center および File Exchange で Kernel Creation from MATLAB Code についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!