矢量化方法
你可以在A和B的转置之间进行矩阵乘法,然后沿着dim-2求和,最后用L – 进行元素划分.
result = sum(A.*B.',2)./L
标杆
本节介绍了针对基于循环的方法的提议方法的运行时和加速测试,如问题的早期部分所列.请注意
在问题的第二部分中提出的另一种基于诊断的方法没有在这些测试中涵盖,因为它的运行时间相对非常
大数字.
基准代码
N_arr = 4000:4000:100000; %// Datasizes
timeall = zeros(2,numel(N_arr)); %// Array to store runtimes
for iter = 1:numel(N_arr)
%// Create random inputs
N = N_arr(iter);
A=rand(N,4); B=rand(4,N); L=rand(N,1);
%// Time the approaches
f = @() mult_twomat_loopy(A,B,L);
timeall(1,iter) = timeit(f); clear f
f = @() mult_twomat_vect(A,B,L);
timeall(2,iter) = timeit(f); clear f
end
%// Plot speedups
figure,hold on,grid on
plot(N_arr,timeall(1,:)./timeall(2,:),'-bo')
xlabel('Datasize, N(Rows in A)'),ylabel('Speedup Factor (x)')
title('Speedup Plot')
相关的功能代码
mult_twomat_loopy.m:
function result = mult_twomat_loopy(A,B,L)
N = size(A,1);
result = zeros(N,1);
for i=1:N
result(i)=A(i,:)*B(:,i)/L(i);
end
mult_twomat_vect.m:
function result = mult_twomat_vect(A,B,L)
result = sum(A.*B.',2)./L;
提议方法的优先级高于循环方法
结论
从加速图可以看出,提出的方法似乎是解决问题的一个非常好的选择.从情节中有趣的观察结果是针对32K数据化的循环方法提出的方法的性能突然下降.这种下降背后的原因似乎是系统内存带宽在这么大的数据量上追回性能,但幸运的是,即使对于这样的数据,加速仍然相当保持在20倍以上.