Matlab使用:使用GPU加速计算

Matlab使用:使用GPU加速计算

Matlab程序的运行效率,很大程度上决定着科研工作的效率。在Matlab中,将多重循环变为矩阵运算无疑是效率最高的方法。如果机器有NVIDIA的显卡,那么可以通过GPU进一步提高程序的运行效率。

这里给出一个利用GPU加速计算的例子,同时提醒几点注意事项。不用一些玩具例子,我们使用稀疏贝叶斯学习(SBL)的迭代过程作为实例,比较调用GPU前后的计算时间。

使用gpuArray()将普通矩阵变为GPU上的矩阵,如前三行所示,使用中可以直接替换变量名,这样不会改动其他部分的名称。

也可在定义中加上'gpuArray',如第九、十两行所示。

使用gather()从GPU上获取普通数组。

%% ---------------------------------------------------------------
% 这里省略一些数据加载,字典生成的过程,只给出迭代步骤的计时。
%% ---------------------------------------------------------------
A = gpuArray(A);
Gamma = gpuArray(Gamma);
Y = gpuArray(Y);
for epoch = 1:5
    tic
    numerator = zeros(nr * nd, nf, 'gpuArray');
    denominator = zeros(nr * nd, nf, 'gpuArray');
    for ifreq = 1:nf
        Af = permute(A(:, :, ifreq), [2, 1]);
        Yf = Y(:, ifreq);
        
        Sigma_Yf = sigma_f * ones(nl, nl) + Af * diag(Gamma) * Af';
        Sigma_Yf_inv = pinv(Sigma_Yf);
        frac1 = permute(Yf' * Sigma_Yf_inv * Af, [2, 1]);
        frac1 = frac1 .* conj(frac1);
        frac2 = diag(Af' * Sigma_Yf_inv * Af);
        numerator(:, ifreq) = frac1;
        denominator(:, ifreq) = frac2;
        
    end
    Gamma_new = Gamma .* sum(numerator, 2) ./ sum(denominator, 2);
    Gamma = Gamma_new;
    toc
end

使用GPU的计算时间为14s,不使用GPU的计算时间为36s。

Note

  1. 必须是N卡,A卡不行;

  2. 由于GPU的原因,single的计算效率比double高,因此可以显示的转换数据类型,进一步减少计算时间。

你可能感兴趣的:(Matlab,Matlab,稀疏贝叶斯学习)