主要内容

Gpuを使用したエンド

この例では、MATLAB®通信工具箱™ソフトウェアの系统对象を使用して,ビット誤り率(BER)シミュレーションを高速化するために使用できる4つの手法の比較を説明します。畳み込み符号化に基づき,小規模なシステムによるMATLAB®编码器™製品を使用したコード生成の効果,并行计算工具箱™製品のparforを使用した並列ル,プ実行,コ,ド生成とparforの組み合わせ,GPUベ,スの系统对象を示します。

この例で取り上げる系统对象は,通信工具箱製品で利用できます。この例を実行するには,MATLAB编码器のライセンス,并行计算工具箱のライセンスおよび十分な性能のGPUが必要です。

システム設計とシミュレションパラメタ

この例では,単純な畳み込み符号化システムを使用してシミュレ,ションを高速化する方法を示します。システムでは,兰迪を使用してランダムメッセ,ジビットが生成されます。送信機はレート1/2畳み込み符号化器を使用してこれらのビットを符号化し,QPSK変調器スキームを適用してから,シンボルを送信します。シンボルは,信号の破損が発生するawgnチャネルを通過します。受信機でQPSK復調が行われ,破損したビットはビタビアルゴリズムによって復号化されます。最後に,ビット誤り率が計算されます。このシステムで使用する系统对象は,以下のとおりです。

  • com . convolutionalencoder -畳み込み符号化

  • com . pskmodulator - QPSK変調

  • awgnchannel - AWGNチャネル

  • com . pskdemodulator - QPSK復調(约LLR)

  • com . viterbidecoder -ビタビ復号化

トランシ,バ,のコ,ドは以下にあります。

ビット誤り率曲線に沿った各点が,上記の送受信コ,ドの多数の反復による結果を表します。適度な時間で正確な結果を得るために,シミュレーションはS / N比(信噪比)ごとに200個以上のビット誤りと,多くても5000までのデータパケットを収集します。パケットは2000メッセ,ジビットを表します。信噪比の範囲は,1 dBから5 dBです。

iterCntThreshold = 5000;minErrThreshold = 200;msgL = 2000;SNRDB = 1:5;

初期化

関数收发器を1回呼び出し,設定時間とオブジェクト作成オーバーヘッドを抽出します。オブジェクトは各関数の永続変数に保存されます。

Errs = 0(长度(snrdb),1);= 0(长度(snrdb),1);Berplot = cell(1,5);Numframes = 500;%GPU版本并行运行500帧。viterbiTransceiverCPU(-10年,1,1);viterbiTransceiverGPU(-10、1、1、numframes);N = 1;%N跟踪正在运行的模拟变量

ワクフロ

この例のワ,クフロ,は以下のとおりです。

  1. 系统对象のベスランシミュレションを実行

  2. MATLAB编码器を使用して,シミュレ,ション用の,MEX関数を生成

  3. Parforを使用して,ビット誤り率シミュレ,ションを並列実行

  4. 生成されたMEX関数をparforと組み合わせ

  5. 图形处理器ベ,スの系统对象を使用

流(1,误码率加速分析实例\n\n);
误码率加速分析实例

ベスランのシミュレション

さまざまな高速化方法の基準点を確定するために,系统对象のみを使用してビット誤り率を生成します。このコンポ,ネントのコ,ドはviterbiTransceiverCPU.mに含まれています。

流(1,***基线-标准系统对象模拟***\n');%为每个SNRDB模拟创建随机流s = RandStream.create(“mrg32k3a”“NumStreams”,1,...“CellOutput”,真的,“NormalTransform”“反转”);RandStream.setGlobalStream (s {1});Ts = tic;2 = 1:元素个数(snrdb)流(1,'迭代数%d,信噪比(dB) = %d\n'第二,snrdb (ii));[errs(ii), (ii)] =viterbiTransceiverCPU(snrdb(ii), minErrThreshold, iterCntThreshold);结束误码。/ (msgL*);baseTime = toc (ts);berplot{N} = ber;desc {N} =“基线”;reportResultsCommSysGPU (N baseTime baseTime“基线”);
* * *基线——标准系统对象模拟* * *迭代1号,信噪比(dB) = 1迭代2号,信噪比(dB) = 2迭代3号,信噪比(dB) = 3迭代4号,信噪比(dB) = 4迭代5号,信噪比(dB) = 5  ---------------------------------------------------------------------------------------------- 版本的收发机|运行时间(sec) |加速度比1。基线| 17.0205 | 1.0000  ----------------------------------------------------------------------------------------------

コ,ド生成

MATLAB编码器を使用して,あらかじめコンパイルされたMATLABコードと一致する最適化されたCコードと墨西哥人ファイルを生成できます。関数viterbiTransceiverCPUはMATLABコード生成サブセットに適合するため,修正せずに墨西哥人関数にコンパイルできます。

例のこの部分を実行するには,MATLAB编码器ラ计算器センスが必要です。

流(1,'\n***基线+代码原***\n');N = N + 1;增加模拟计数器创建编码器对象并关闭将导致低的检查%的性能。流(1,“生成代码……”);Config_obj = code .config(墨西哥人的);config_obj。EnableDebugging = false;config_obj。IntegrityChecks = false;config_obj。ResponsivenessChecks = false;config_obj。EchoExpressions = false;生成MEX文件codegen (“viterbiTransceiverCPU.m”“配置”“config_obj”“参数”, {snrdb(1), minErrThreshold, iterCntThreshold}) fprintf(1,“。\ n”);%运行一次以消除启动开销。viterbiTransceiverCPU_mex(-10年,1,1);s = RandStream.getGlobalStream;重置(年代);使用生成的MEX函数viterbiTransceiverCPU_mex%模拟循环。Ts = tic;2 = 1:元素个数(snrdb)流(1,'迭代数%d,信噪比(dB) = %d\n'第二,snrdb (ii));[errs(ii), (ii)] = viterbiTransceiverCPU_mex(snrdb(ii), minErrThreshold, iterCntThreshold);结束误码。/ (msgL*);trialtime = toc (ts);berplot{N} = ber;desc {N} =“codegen”;reportResultsCommSysGPU (N trialtime baseTime“基线+编码原”);
***基线+代码生成***生成代码…代码生成成功。完成了。迭代1号,信噪比(dB) = 1迭代2号,信噪比(dB) = 2迭代3号,信噪比(dB) = 3迭代4号,信噪比(dB) = 4迭代5号,信噪比(dB) = 5  ---------------------------------------------------------------------------------------------- 版本的收发机|运行时间(sec) |加速度比1。基线| 17.0205 | 1.0000基线+ codegen | 14.3820 | 1.1835  ----------------------------------------------------------------------------------------------

Parfor -パラレルル,プ実行

MATLABはparforを使用して,すべての信噪比値に対して送受信コ,ドを並列実行します。これには,並列プ,ルを開き,parforル,プを追加する必要があります。

例のこの部分を実行するには,并行计算工具箱のライセンスが必要です。

流(1,'\n***基线+ parfor***\n');流(1,“访问多个CPU内核…\n”);如果isempty (gcp (“nocreate”));poolWasOpen = false;其他的Pool = gcp;poolWasOpen = true;结束西北= pool.NumWorkers;N = N + 1;增加模拟计数器snrN =数字(snrdb);mT = minErrThreshold / nW;iT = iterCntThreshold / nW;errN = 0 (nW, snrN);itrN = 0 (nW, snrN);%复制SNRDBsnrdb_rep = repmat (snrdb, nW, 1);%为每个工作人员创建一个独立的流s = RandStream.create(“mrg32k3a”“NumStreams”西北,...“CellOutput”,真的,“NormalTransform”“反转”);%跑前parforjj = 1:西北RandStream.setGlobalStream (s {jj});viterbiTransceiverCPU(- 10,1,1);结束流(1,“开始找工作……”);Ts = tic;parforjj = 1:西北ii=1:snrN [err, itr] = viterbiTransceiverCPU(snrdb_rep(jj,ii), mT, iT);errN(jj,ii) = err;itrN(jj,ii) = itr;结束结束ber = sum(errN)。/ (msgL *总和(itrN));trialtime = toc (ts);流(1,“。\ n”);berplot{N} = ber;desc {N} =“parfor”;reportResultsCommSysGPU (N trialtime baseTime“基线+ parfor”);
***基线+ parfor***访问多个CPU核…使用“本地”配置文件启动并行池(parpool)…连接到并行池(worker数:8). Start parfor job…完成了。---------------------------------------------------------------------------------------------- 版本的收发机|运行时间(sec) |加速度比1。基线| 17.0205 | 1.0000基线+密码| 14.3820 | 1.1835基线+ parfor | 2.6984 | 6.3075  ----------------------------------------------------------------------------------------------

Parforとコ,ド生成

最後の2の方法を組み合わせることで,さらに高速化することができます。コンパ电子邮箱ルされた电子邮箱関数は,parforル,プ内部で実行できます。

例のこの部分を実行するには,MATLAB编码器のライセンスと并行计算工具箱のライセンスが必要です。

流(1,'\n***基线+代码原+ parfor***\n');N = N + 1;增加模拟计数器%跑前parforjj = 1:西北RandStream.setGlobalStream (s {jj});viterbiTransceiverCPU_mex(1,1,1);%使用相同的mex文件结束流(1,“开始找工作……”);Ts = tic;parforjj = 1:西北ii=1:snrN [err, itr] = viterbiTransceiverCPU_mex(snrdb_rep(jj,ii), mT, iT);errN(jj,ii) = err;itrN(jj,ii) = itr;结束结束ber = sum(errN)。/ (msgL *总和(itrN));trialtime = toc (ts);流(1,“。\ n”);berplot{N} = ber;desc {N} ='codegen + parfor';reportResultsCommSysGPU (N trialtime baseTime“基线+编码原+ parfor”);
***Baseline + codegen + parfor*** Start parfor job…完成了。---------------------------------------------------------------------------------------------- 版本的收发机|运行时间(sec) |加速度比1。基线| 17.0205 | 1.0000基线+密码| 14.3820 | 1.18354.基线+ parfor | 2.6984 | 6.3075基线+ codegen + parfor | 2.7059 | 6.2902  ----------------------------------------------------------------------------------------------

GPU

関数viterbiTransceiverCPUが使用する系统对象は图形处理器での実行時に利用できます。Gpuベ,スバ,ジョン:

  • com .gpu. convolutionalencoder -畳み込み符号化

  • com .gpu. pskmodulator - QPSK変調

  • com .gpu. awgnchannel - AWGNチャネル

  • com .gpu. psk解调器- QPSK復調(约LLR)

  • com .gpu. viterbidecoder -ビタビ復号化

大量デ,タの一括処理には,gpuが最も効果的です。GPUベースの System object は 1 回の step メソッドの呼び出しで複数のフレームを処理できます。変数numframesは呼び出しごとに処理されるフレ,ム数を表します。並列処理がviterbiTransceiverCPUの呼び出し単位ではなく,オブジェクト単位であるという点を除き,これはparforに類似しています。

例のこの部分を実行するには,并行计算工具箱のライセンスとCUDA®1.3対応GPUが必要です。

流(1,' \ n * * * * * * GPU \ n”);N = N + 1;增加模拟计数器试一试dev = parallel.gpu.GPUDevice.current;流(...'已检测到GPU (%s, %d多处理器,计算能力%s)\n'...dev.Name, dev.MultiprocessorCount, dev.ComputeCapability);sg = parallel.gpu.RandStream.create(“mrg32k3a”“NumStreams”,1,“NormalTransform”“反转”);parallel.gpu.RandStream.setGlobalStream (sg);Ts = tic;2 = 1:元素个数(snrdb)流(1,'迭代数%d,信噪比(dB) = %d\n'第二,snrdb (ii));[errs(ii), (ii)] =viterbiTransceiverGPU(snrdb(ii), minErrThreshold, iterCntThreshold, numframes);结束误码。/ (msgL*);trialtime = toc (ts);berplot{N} = ber;desc {N} =“图形”;reportResultsCommSysGPU (N trialtime baseTime“基线+ GPU”);流(1,“。\ n”);% #好< CTCH >%报告没有找到合适的GPU。流(1,“找不到合适的GPU”...\n']);结束
* * * * * * GPU GPU检测(特斯拉V100-PCIE-32GB 80多处理器计算能力7.0)迭代1号,信噪比(dB) = 1迭代2号,信噪比(dB) = 2迭代3号,信噪比(dB) = 3迭代4号,信噪比(dB) = 4迭代5号,信噪比(dB) = 5  ---------------------------------------------------------------------------------------------- 版本的收发机|运行时间(sec) |加速度比1。基线| 17.0205 | 1.0000基线+密码| 14.3820 | 1.18354.基线+ parfor | 2.6984 | 6.3075基线+编码原+ parfor | 2.7059 | 6.2902基线+ GPU | 0.1895 | 89.8137  ---------------------------------------------------------------------------------------------- 完成了。

解析

これらの試行結果を比較すると,すべてのシミュレーション高速化方法の中でGPUが圧倒的に速いことが明らかです。このパフォ,マンス向上を実現するには,シミュレ,ションコ,ドをごくわずかに変更するだけです。それにもかかわらず,以下のプロットが示すように,ビット誤り率性能は失われません。曲線における微小な差異は,異なる乱数生成アルゴリズムや,曲線上の同じ点における異なるデータの品質を平均化したことの影響です。

Lines = {“kx -。”“ro - - - - - -”“cs——”“m ^:”“g * - - - - - -”};Ii =1:数字(desc)符号学(snrdb, berplot{Ii}, lines{Ii});持有结束持有;标题(“各种加速策略的误码率”);包含(信噪比(dB));ylabel (“方方面面”);传奇(desc {:});

クリ,ンアップ

並列プ,ルを元の状態にします。

如果~ poolWasOpen删除(gcp);结束
使用“本地”配置文件的并行池正在关闭。