Armadilloフォーラム

Armadilloの演算性能向上方法について

sudohayato

2017年5月26日 20時03分

お世話になっております。須藤と申します。

Armadilloの処理性能(演算性能)を向上させる方法はありますでしょうか?
浮動小数や平方根、三角関数を多用しているために演算に時間がかかっており、
HWの変更なしに演算時間を縮めたいと考えております。

以上、よろしくお願いいたします。

コメント

katsumata

2017年5月30日 16時09分

勝俣と申します。

> 浮動小数や平方根、三角関数を多用しているために演算に時間がかかっており、

私は三角関数の演算時間短縮が必要な場合は巨大なテーブルを使用しています。
テーブルを引くだけ、もしくは直線補間(演算量が若干増えますが、テーブルのサイズを小さくできます)。
最高速が必要なら0~5/2πまでテーブルを持たせてサインもコサインも一発。
時間に余裕があれば0~π/2までのテーブルを使い回し。

よろしくお願いします。

sudohayato

2017年5月30日 20時01分

勝俣さん

ご返信ありがとうございます。須藤です。
三角関数ではテーブルを使用することで演算時間の短縮が可能とのことで参考にさせていただきます。
浮動小数での演算時間を短縮する方法はご存知でしょうか?

以上、よろしくお願いいたします。

katsumata

2017年5月31日 12時55分

勝俣です。お世話になっております。

> 浮動小数での演算時間を短縮する方法はご存知でしょうか?

FPUは搭載されているでしょうか?
搭載されている場合:CPUによっては倍精度より単精度の方が早かったりします。
搭載されていない場合:単精度の方が高速です。更に工夫して整数演算で代用できないか検討してください。

平方根も範囲が限定されているならテーブル参照で行けるかもしれません。
限定されていないと、正規化→テーブル参照→戻す、となって、かえって遅くなるかもしれません。

よろしくお願いします。

izawa

2017年5月31日 16時56分

毎度お世話様、高速化を業務として行っているイットーソフトウェアの伊澤です。

演算の詳細も不明ですし、どの程度早くしたいのかも不明ですが、簡単にチェックポイントを。
尚、Armでの知見は余りありませんので、一般論で。

> 浮動小数
演算速度が加減算>乗算>>>除算なので、除算を乗算に置き換えるとかループの外に出すとか。
いっそ、必要な精度がはっきりしているなら固定小数点化して整数演算で済ませる手もあります。
そうそう、整数の定数除算程度ならgccがなんとかしてくれますが、整数の除算も避けたいところです。

>平方根
精度にもよりますが、真面目にやるならニュートン法で自前で求めるとそこそこ早いものになります。
まぁ、値域が分かっているなら既に指摘されているようにテーブル参照ですね。
そも、平方根が本当に必要かどうかの洗い出しも必要です。
例えば平面上の距離の大小を比較する場合、sqrt(x*x+y*y)ではなくx*x+y*yを比較するなど。

>三角関数
これも指摘されているようにテーブル参照でしょうか。
場合によっては演算回数そのものも見直した方がいいかもしれません。
ぶっちゃけ、cos(x)はsin(x+90°)ですし。

一番の問題は、演算量と所要時間のネックがはっきり分析できているかどうかでしょう。
存外、sprintf()で数値を文字列化するだけで意外に時間が掛かりますのでそれも念頭に。
デバッグ出力をテキストでシリアル出力しているなら、バイナリダンプに変更して
ファイルに落とし、PCで加工して見るなどの工夫も手かもしれません。
後は、型が混ざる演算の暗黙のキャストにもご用心。

sudohayato

2017年6月12日 19時26分

勝俣さん、伊澤さん

コメントありがとうございます。
ルンゲクッタ法で計算している部分で一番処理時間がかかっているようです。
演算に2ms程度かかっているところをどうにか速くできないかと悩んでいるところです。
#1ms程度に収めるのが目標です

HW性能の限界もあると思いますので別HWの検討も進めようと思います。

以上、よろしくお願いいたします。