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跟踪正在运行的模拟变量
ワクフロ
この例のワ,クフロ,は以下のとおりです。
系统对象のベスランシミュレションを実行
MATLAB编码器を使用して,シミュレ,ション用の,MEX関数を生成
Parforを使用して,ビット誤り率シミュレ,ションを並列実行
生成されたMEX関数をparforと組み合わせ
图形处理器ベ,スの系统对象を使用
流(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);结束
使用“本地”配置文件的并行池正在关闭。