主要内容

使用并行计算工具箱加速误码率模拟

这个示例使用并行计算工具箱™来加速一个简单的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的属性.模拟运行范围为美元E_ {b} / N_ {0} $为每个工作人员分配值,而不是分配单个值美元E_ {b} / N_ {0} $指出每个工人,因为前一种方法提供了最大的性能改进。

numWorkers = pool.NumWorkers;

确定长度EbNoVec在嵌套中使用parfor循环。类中嵌套的For循环的范围为适当的变量分类parfor必须由常数或变量定义。

lenEbNoVec = length(EbNoVec);

将内存分配给用于存储函数生成的数据的数组,helper_qpsk_sim_with_awgn

[numErrors,numBits] =交易(零(长度(EbNoVec),numWorkers));

运行模拟并确定执行时间。

抽搐parforn = 1:numWorkersidx = 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秒