【发布时间】:2015-05-07 10:33:55
【问题描述】:
在 Matlab 中,我正在寻找一种在 GPU 上最有效地计算频率平均周期图的方法。
我知道最重要的是尽量减少 for 循环并使用已经内置的 GPU 功能。然而,我的代码仍然感觉相对未优化,我想知道我可以对其进行哪些更改以获得更好的速度。
r = 5; % Dimension
n = 100; % Time points
m = 20; % Bandwidth of smoothing
% Generate some random rxn data
X = rand(r, n);
% Generate normalised weights according to a cos window
w = cos(pi * (-m/2:m/2)/m);
w = w/sum(w);
% Generate non-smoothed Periodogram
FT = (n)^(-0.5)*(ctranspose(fft(ctranspose(X))));
Pdgm = zeros(r, r, n/2 + 1);
for j = 1:n/2 + 1
Pdgm(:,:,j) = FT(:,j)*FT(:,j)';
end
% Finally smooth with our weights
SmPdgm = zeros(r, r, n/2 + 1);
% Take advantage of the GPU filter function
% Create new Periodogram WrapPdgm with m/2 values wrapped around in front and
% behind it (it seems like there is redundancy here)
WrapPdgm = zeros(r,r,n/2 + 1 + m);
WrapPdgm(:,:,m/2+1:n/2+m/2+1) = Pdgm;
WrapPdgm(:,:,1:m/2) = flip(Pdgm(:,:,2:m/2+1),3);
WrapPdgm(:,:,n/2+m/2+2:end) = flip(Pdgm(:,:,n/2-m/2+1:end-1),3);
% Perform filtering
for i = 1:r
for j = 1:r
temp = filter(w, [1], WrapPdgm(i,j,:));
SmPdgm(i,j,:) = temp(:,:,m+1:end);
end
end
特别是,在从傅立叶变换数据计算初始 Pdgm 时,我看不到优化 for 循环的方法,我觉得我使用 WrapPdgm 玩的技巧是为了利用 @ GPU 上的 987654324@ 感觉没有必要,如果有一个平滑的功能。
【问题讨论】:
标签: performance matlab optimization gpu signal-processing