主要内容

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

这个例子使用并行计算工具箱™加速一个简单的,QPSK误码率(BER)模拟。该系统由QPSK调制器、QPSK解调器、AWGN信道和误码率计数器组成。

设置仿真参数。

EbNoVec = 8;% Eb/ dB中没有值totalErrors = 200;%每个Eb/No值所需的比特错误数totalBits = 1 e7;%每个Eb/No值传输的总比特数

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

[numErrors, numBits] = deal(zero (length(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;

对于“并行计算工具箱”可用的情况,重新运行模拟。创建一个工作人员池。

池=质量;断言(~ isempty(池),(无法创建并行池。...“尝试使用“parpool”命令手动创建池。”])
使用“local”配置文件启动并行池(parpool)…连接到并行池(工作人员数量:6)。

从。确定可用工人的数量NumWorkers的属性.模拟运行的范围为美元E_ {b} / N_ {0} $值,而不是分配一个单独的工人美元E_ {b} / N_ {0} $指出每个工作者,因为前一种方法提供了最大的性能改进。

numWorkers = pool.NumWorkers;

确定…的长度EbNoVec用于嵌套的parfor循环。类中嵌套的For循环的范围,用于正确的变量分类parfor必须由常数或变量定义。

lenEbNoVec =长度(EbNoVec);

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

[numErrors, numBits] =交易(0(长度(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 (“方方面面”网格)

你可以看到,误码率曲线本质上是相同的,任何方差都是由于不同的随机数种子。

比较每个方法的执行时间。

流(['\nSimulation time = %4.1f sec for one worker\n'...'模拟时间= %4.1f秒为多个工作者\n'],...simBaselineTime simParallelTime)流(' parfor的处理器数= %d\n'numWorkers)
parfor = 6的处理器数量