蒙特卡洛法 Matlab多核,向量化,GPU优化计算积分
看了一下基于Matlab的GPU编程这本书,把里面的一个计算积分的例子几种方法拿出来做了说明。
蒙特卡洛法求面积,也就是生成再坐标系内的随机数,积分求面积也就是求位于曲线内的点数和整个坐标系内点数之比。
方法1到4分别是采用普通方法,并行for循环,向量化以及GPU运算,来对比耗时。我用的是 MX450的显卡还是比较渣的。
%蒙特卡洛计算面积
clear;clc;
%计算 x*(x-2)^6在0~2区间内的面积积分
xp = 0:0.01:2;
yp = xp.*(xp-2).^6;
plot(xp,yp); grid;
xlabel('x'); ylabel('y');
%一:常规方法(单独只使用for循环)
counter = 0;
n = 100000000;
for i = 1:n
x = 2*rand;
y = 8*rand;
if(y<x*(x-2)^6)
counter = counter + 1;
area_CPU = counter/n*2*8;
elapsedTime = toc;
disp(['计算结果:',num2str(area_CPU), ' CPU:elapsedTime(nomoral):', num2str(elapsedTime)]);
%二:常规方法(开启多核pool,使用parfor循环)
counter = 0;
n = 100000000;
parfor i = 1:n
x = 2*rand;
y = 8*rand;
if(y<x*(x-2)^6)
counter = counter + 1;
area_CPU_MutilPool = counter/n*2*8;
elapsedTime = toc;
disp(['计算结果:',num2str(area_CPU_MutilPool), ' CPU:elapsedTime(MutilPool):', num2str(elapsedTime)]);
%三: Matlab向量化
x = 2*rand(n,1);
y = 8*rand(n,1);
counter = sum(y<(x.*(x-2).^6));
area_CPU_vectorization = counter/n*2*8;
elapsedTime = toc;
disp(['计算结果:',num2str(area_CPU_vectorization), ' CPU:elapsedTime(vectorization)', num2str(elapsedTime)]);
%GPU优化
n = n/100;
counter = 0;
for i = 1:100
x = gpuArray(2*rand(n,1));
y = gpuArray(8*rand(n,1));
counter = counter + sum(y<(x.*(x-2).^6));