在通信与信息领域中,我们常会使用蒙特卡洛法,或者需要仿真多次取平均,为了降低程序的运行时间,我们考虑调用多个CPU核来运行程序,这个时候需要用到MATLAB的pool-object。具体来讲就是由普通的for循环变成parfor循环,主要分为(1-4)个步骤,已在下面的例程中说明。
% MATLAB code
% (1) too see whether pool-object is running, if so, turn if off
poolobj = gcp('nocreate'); delete(poolobj);
% (2) decide how many cores are required
% No.core should be less than CPU cores...
% unless settled in another way on the setting preface.
p = parpool(16);
% Example ......
for snr_idx = 1:length(SNR_dB)
toc, tic,snr_idx,
sigma2 = (optIn.Nseg) * 1 / 10.^(SNR_dB(snr_idx)/10);
%sigma2 = (optIn.Nseg) * optIn.Ka/optIn.L / 10.^(SNR_dB(snr_idx)/10);
MonteCarlo = MonteCarlos(snr_idx);
No_MD_BA1 = zeros(MonteCarlo,1);
No_FA_BA1 = zeros(MonteCarlo,1);
No_MD_BA0 = zeros(MonteCarlo,1);
No_FA_BA0 = zeros(MonteCarlo,1);
% (3) parallel loops: there is no link-relationship between distinc mt.
parfor mt = 1:MonteCarlo
[No_MD1, No_FA1, No_MD0, No_FA0] = BiG_AMP_handle(integer_rather_randi, needencode, needCRC, sigma2, optIn);
No_MD_BA1(mt) = No_MD1;
No_FA_BA1(mt) = No_FA1;
No_MD_BA0(mt) = No_MD0;
No_FA_BA0(mt) = No_FA0;
end
No_FAs1(snr_idx) = sum(No_FA_BA1);
No_MDs1(snr_idx) = sum(No_MD_BA1);
No_FAs0(snr_idx) = sum(No_FA_BA0);
No_MDs0(snr_idx) = sum(No_MD_BA0);
end
% (4) delete pool-object
delete(p)