MATLAB Answers

Simulinkを用いた足し算の高速化

3 views (last 30 days)
Koji
Koji on 18 Jun 2018
Commented: Koji on 27 Jun 2018
MATLAB/Simulinkを用いて、符号なし16bit整数値(0~65535)同士のすべての組み合わせで足し算の確認を高速に行いたいと思い、ブロック図を作成しました。現状では数時間かかってしまいますが、5分ほど(C言語でコンパイル実行した場合と同等の速度)で計算を完了したいと思っております。どうすればこのSimulinkブロックを高速で実行できますでしょうか。もしくは、他の方法がありますでしょうか。
実装方法について述べます。片方の入力値をCounter Free Runnningのサンプル時間1で生成しています。もう片方の入力値も同様にCounter Free Runningで生成していますが、こちらはサンプル時間を2^16(=65536)としています。これを2^32サンプル時間行うことで、すべての符号なし16bit整数値の組の足し算を実装しました。
Simulinkのブロック図は添付の通りです。
お手数をおかけしますが、ご回答宜しくお願いいたします。

  0 Comments

Sign in to comment.

Accepted Answer

Naoya
Naoya on 27 Jun 2018
スカラの加算処理を 2^32 サンプルずつ、シリアルに処理しますので、ご報告頂いたレベルの計算時間が予想されます。 モデルを変更せずに高速化させる方法としては、「アクセラレータモード」や「ラピッドアクセラレータモード」など考えられますが、今回のモデルについてはいずれも劇的な効果は望めません。
なお、Simulink の 信号処理系のオプション製品である DSP System Toolbox と呼ばれる製品をお持ちの場合は、フレームベースの処理を行うことができ、あるフレームサイズごとにベクトル化して並列に計算を行い、処理を高速化することも可能です。
ご参考までとなりますが、フレームベース処理については、 下記 DSP System Toolbox に詳細が説明されます。
DSP System Toolbox がない環境での考えられる方法としては、予め、信号をベクトル化して処理を行うのは如何でしょうか?
下記は検討モデルの一例キャプチャとなります。
uint16加算対象の片側のブロックを [0:65535] としたベクトルを Constant ブロックとして定義します。 もう片方の uint16加算対象のブロックを Counter Free-Running ブロックとします。 それぞれサンプリング時間を一致させ、Counter Free-Running が 65535 に到達するまでのシミュレーション時間を設定します。
ロギングのサイズが大きいため、To File ブロックとして、MATLAB のワークスペース上ではなく、直接、ファイルへ出力するようにします。
こちらの処理では、およそ数十秒で処理を行うことができます。

  1 Comment

Koji
Koji on 27 Jun 2018
ご回答ありがとうございました。
ご提案頂いたベクトル化について検討いたします。

Sign in to comment.

More Answers (0)

Sign in to answer this question.