1、不使用GPU实现Matlab加速
2、parfor的使用
1、不使用GPU实现Matlab加速 (参考《GPU与MATLAB混合编程》)
1.1 将数据表示为向量/矩阵的形式,有助于尽量减少for循环的使用
%nonVecl.m
A=0:0.0001:10;
B=0:0.0001:10;
z=zeros(size(A));
y=0;
for i=1:1000001
z(i)=sin(0.5*A(i))*exp(B(i)^2);
y=y+z(i);
end
%Vecl.m
A=0:0.0001:10;
B=0:0.0001:10;
z=zeros(size(A));
y=0;
y=sin(0.5.*A)*exp(B.^2);
注意:符号*表示矩阵乘法,而符号.*则表示矩阵中对应元素相乘,其中按元素运算的还有.^,./,sqrt(),sin(),log(),abs()等
1.2 需要对每个元素设定上下边界时,可以采用min和max替代if和else语句设置元素边界:
if(A(i)<0.1) A(i)=0.1;
A=max(A,0.1);
1.3 如果需要查找和替换某些元素的值,可以用find函数替代if和else来保持向量化
if(A(i)==0.5) A(i)=0;
A(find(A==0.5))=0;
1.4 预分配
通过为所需数组预分配内存,能够获得相当显著的加速。
1.5 矩阵按列嵌套循环更有利于程序的运行
注意:当矩阵较为稀疏的时候可以考虑采用稀疏矩阵存储数据
2、parfor的使用
%启动并行计算
CoreNum=6;
parpool('local',CoreNum);
%关闭并行计算
delete(gcp('nocreate'));
注意:
(1)循环变量在循环体中的使用要具有独立性,循环体之间不相关。
(2)parfor中不能嵌套parfor