Top > RX
Last-modified: Sat, 17 Aug 2013 17:35:10 JST

RX

ルネサスのマイコンRXシリーズのメモ。兄弟ページとしてRL78もあるのでよろしくね。

私が感じた特徴 Edit

ROMへアクセスはノーウェイト。すぐにテーブル化したくなるw


128kBまでのビルドだと純正コンパイラCC-RXの無料版が使えます。最適化オプションを付けた時の逆アセンブルの内容は(私としては)満足のいくものでした。RL78マイコンの純正コンパイラCA78K0Rと雲泥の差です。


速度で最適化したプログラムを走らせたとき、高い演算能力に感動した。が、その後、コーディングを進めていくと、周辺ユニット用のレジスタへのアクセスに平均5クロックかかることが判明。演算前にデータを周辺ユニットから受け取ったり、計算結果を周辺ユニットに書き出す時に遅くてとても残念(演算の方が実行時間短かったりする…)。

レジスタによっては、32ビットアクセスできたりするので、まとめて取り込むなどの工夫ができる場合あり。

16bit積和(DSP命令) Edit

2013/02/28 調べ中 コンパイラはCC-RX ver.1.02.01

ルネサスのホームページにあるアプリケーションノートを見ると、コンパイラの組み込み関数のmacl()が使われている。

もやねさんのページに実行時間の比較が書かれているが、rmpaw()を使った方が速い。逆アセンブルを見るとrmpaw()は単にRMPA.W命令を呼び出しているのに対して、macl()の方は条件分岐が入っている(理解しきっていないが、積和回数によるループ終了判断?)。

rmpaw()の方も、逆アセンブルを見ると、長い引数の処理とRMPA.W命令の準備にちょっと無駄に感じる箇所があり(2013-08-17追記:RMPA命令は割込で中断する命令のためレジスタの退避が必要)、例えば3x3行列と3要素ベクトルの乗算など、小さ目かつ計算量が決まった計算なら、インラインアセンブラを使ってmacl()の無駄を削いだものを作ってやると、rmpaw()よりも高速化できるのではないかと思う(ただし、後述するが、積和の回数が多ければ、結局rmpaw()に漸近すると思われる)。

macl()のアセンブル展開を見れば分かるが、MACLOとMACHI命令がレジスタしか受け付けないので、32ビットずつデータをセットして、MACLOとMACHIを1回ずつ呼び出すことで、MOV命令を減らすことが高速化のポイントか。macl()はアキュムレータのクリアを MOVE.L #0,R5; MULLO R5,R5; で済ませているようだ(損得の検証はしていないが、何か得なのだろう)。

即席で、3要素の内積はこんな感じか(メモです:非保証)

2013/03/29 2回目のMACLOをMULLOに変更して先頭に持ってこれば、アキュームレータのクリアをする必要が無いことに気付いた。なので、下のコードはさらに短くできます。コードは時間ができたら確認して修正します。

というか、ルネサスの資料 R01AN0254JJ0100 の15ページ目にモロ書かれてました。それ見ましょう。。

すべてを展開すべてを収束
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 
-
|
|
|
|
|
|
|
|
|
|
!
#pragma inline_asm dot_xyz
long dot_xyz(short a[3], short b[3]) {
    MOV.L #0H, R5;
    MULLO R5, R5; //ACCをゼロに
    MOV.L [R1], R3; //1クロック
    MOV.L [R2], R4; //2クロックになるみたい(シミュレータの結果)
    MACLO R3, R4;
    MACHI R3, R4;
    MOV.L 04H[R1], R3;
    MOV.L 04H[R2], R4;
    MACLO R3, R4;    
    MVFACMI R1;
}

積和計算の回数が膨大で、プリプロセスとポストプロセスのオーバーヘッドがゼロに見なせるとすると、2回の積和を行うために、MOV.Lを2回、MACLO、MACHI の合計5クロックになる(2回目のMOV.Lはシミュレータによると2クロックになるみたい)。つまり1回の積和は2.5クロック。

ここで、RMPA.W命令の実行時間を見ると(ハードウェアマニュアルに掲載されてます)、オーバーヘッドを考えなければ、積和計算1回で2.5クロックでまったく同じ。

MACxxの32bit版は無いので、32bitの積和は最初からrmpal()を使うべきか?(2013-08-17追記:RMPA命令は割込による中断に対応するためにレジスタの退避が必要でオーバーヘッドが大きい)。



コメント

適当に書いて頂いて構いません。スパム対策があるので、書き込めない場合があります。また、ボタンを押した後にしばらく時間がかかります。

新規コメント(ラジオボタンで親コメント選択可)
お名前

現在、コメントはありません