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

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

採用された回答

Naoya
Naoya 2018 年 6 月 27 日
スカラの加算処理を 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 件のコメント
Koji
Koji 2018 年 6 月 27 日
ご回答ありがとうございました。
ご提案頂いたベクトル化について検討いたします。

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File Exchange計測と統計 についてさらに検索

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!