最新のリリースでは,このページがまだ翻訳されていません。このページの最新版は英語でご覧になれます。

并行计算工具箱を使用した误码率シミュレーションの高速化

この例では,并行计算工具箱を使用してシンプルなQPSKビット誤り率(BER)シミュレーションを高速化する方法を説明します。システムは,QPSK変調器,QPSK復調器,AWGNチャネルおよびビット誤り率カウンターから構成されます。この例では,4つの並列プロセッサを使用します。

シミュレーションパラメーターを設定します。

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

関数helper_qpsk_sim_with_awgnによって生成されるデータを格納するために使用する配列にメモリを割り当てます。

[numErrors, numBits] = deal(0 (length(EbNoVec),1));

シミュレーションを実行し,実行時間を判別します。プロセッサを1つだけ使用して,ベースライン性能を見極めます。結果として,通常为ルのープが使用されていることがわかります。

抽搐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;

并行计算工具箱が使用可能な場合のシミュレーションを再び実行します。ワーカーのプールを作成します。

池=质量;

使用可能なワーカーの数をNumWorkersプロパティから求めます。前のメソッドで最大性能への改善が行われたので,このシミュレーションでは,それぞれのワーカーに1つの美元E_ {b} / N_ {0} $点を割り当てるのではなく,美元E_ {b} / N_ {0} $値の範囲をそれぞれのワーカーにおいて実行します。

numWorkers = pool.NumWorkers;

入れ子にされたparforループで使用するためのEbNoVecの長さを決定します。変数が適切に分類されるように,parfor为ルに入れ子にされるープの範囲は定数または変数で定義しておかなければなりません。

lenEbNoVec =长度(EbNoVec);

関数helper_qpsk_sim_with_awgnによって生成されるデータを格納するために使用する配列にメモリを割り当てます。

[numErrors, numBits] = deal(0 (length(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 (“方方面面”网格)

乱数のシードが異なるので,误码率曲線はどの分散でも基本的には同じであるということがわかります。

各メソッドの実行時間を比較します。

流([一个worker ' n'的模拟时间= %4.1f秒,多个工人\n'的模拟时间= %4.1f秒),simBaselineTime simParallelTime)
一个工人的模拟时间= 101.0秒,多个工人的模拟时间= 32.8秒

4つのプロセッサコアを使用したこの例では,速度向上の係数は約4でした。