使用并行计算工具箱加速误码率模拟
这个示例使用并行计算工具箱™来加速一个简单的QPSK误码率(BER)模拟。该系统由QPSK调制器、QPSK解调器、AWGN信道和误码率计数器组成。
设置仿真参数。
EbNoVec = 5:8;% Eb/没有dB值totalErrors = 200;每个Eb需要的误码率% /No值totalBits = 1e7;%每个Eb传输的总比特数/无值
将内存分配给用于存储函数生成的数据的数组,helper_qpsk_sim_with_awgn
.
[numErrors, numBits] =交易(零(长度(EbNoVec),1));
运行模拟并确定执行时间。只使用一个处理器来确定基准性能。因此,注意使用普通的for循环。
抽搐为idx = 1:length(EbNoVec) errorStats = helper_qpsk_sim_with_awgn(EbNoVec,idx,...totalErrors totalBits);numErrors(idx) = errorStats(idx,2);numBits(idx) = errorStats(idx,3);结束simBaselineTime = toc;
计算误码率。
ber1 = numErrors ./ numBits;
在并行计算工具箱可用的情况下,重新运行模拟。创建一个工人池。
Pool = gcp;断言(~ isempty(池),(“无法创建并行池。”...尝试使用parpool命令手动创建存储池])
中确定可用工人的数量NumWorkers
的属性池
.模拟运行范围为为每个工作人员分配值,而不是分配单个值
指出每个工人,因为前一种方法提供了最大的性能改进。
numWorkers = pool.NumWorkers;
确定长度EbNoVec
在嵌套中使用parfor
循环。类中嵌套的For循环的范围为适当的变量分类parfor
必须由常数或变量定义。
lenEbNoVec = length(EbNoVec);
将内存分配给用于存储函数生成的数据的数组,helper_qpsk_sim_with_awgn
.
[numErrors,numBits] =交易(零(长度(EbNoVec),numWorkers));
运行模拟并确定执行时间。
抽搐parforn = 1:numWorkers为idx = 1:lenEbNoVec errorStats = helper_qpsk_sim_with_awgn(EbNoVec,idx,...totalErrors / numWorkers totalBits / numWorkers);numErrors(idx,n) = errorStats(idx,2);numBits(idx,n) = errorStats(idx,3);结束结束simParallelTime = toc;
计算误码率。在这种情况下,来自多个处理器的结果必须组合起来以生成聚合误码率。
ber2 = sum(numErrors,2) ./ sum(numBits,2);
比较误码率值,以验证获得的结果与工人数量无关。
ber1 semilogy (EbNoVec ',“- *”, ber2 EbNoVec””——^”)传说(“单处理器”,多处理器的,“位置”,“最佳”)包含(“Eb /不(dB)”) ylabel (“方方面面”网格)
您可以看到,由于不同的随机数种子而产生的任何方差,误码率曲线基本上是相同的。
比较每个方法的执行时间。
流([\n模拟时间= %4.1f秒\n',...'多工人模拟时间= %4.1f秒\n'),...simBaselineTime simParallelTime)流(parfor的处理器数量= %d\nnumWorkers)
对于一个worker,模拟时间= 24.6秒。对于多个worker,模拟时间= 6.1秒