sudohayato
2017年5月26日 20時03分
お世話になっております。須藤と申します。
Armadilloの処理性能(演算性能)を向上させる方法はありますでしょうか?
浮動小数や平方根、三角関数を多用しているために演算に時間がかかっており、
HWの変更なしに演算時間を縮めたいと考えております。
以上、よろしくお願いいたします。
コメント
sudohayato
katsumata
izawa
毎度お世話様、高速化を業務として行っているイットーソフトウェアの伊澤です。
演算の詳細も不明ですし、どの程度早くしたいのかも不明ですが、簡単にチェックポイントを。
尚、Armでの知見は余りありませんので、一般論で。
> 浮動小数
演算速度が加減算>乗算>>>除算なので、除算を乗算に置き換えるとかループの外に出すとか。
いっそ、必要な精度がはっきりしているなら固定小数点化して整数演算で済ませる手もあります。
そうそう、整数の定数除算程度ならgccがなんとかしてくれますが、整数の除算も避けたいところです。
>平方根
精度にもよりますが、真面目にやるならニュートン法で自前で求めるとそこそこ早いものになります。
まぁ、値域が分かっているなら既に指摘されているようにテーブル参照ですね。
そも、平方根が本当に必要かどうかの洗い出しも必要です。
例えば平面上の距離の大小を比較する場合、sqrt(x*x+y*y)ではなくx*x+y*yを比較するなど。
>三角関数
これも指摘されているようにテーブル参照でしょうか。
場合によっては演算回数そのものも見直した方がいいかもしれません。
ぶっちゃけ、cos(x)はsin(x+90°)ですし。
一番の問題は、演算量と所要時間のネックがはっきり分析できているかどうかでしょう。
存外、sprintf()で数値を文字列化するだけで意外に時間が掛かりますのでそれも念頭に。
デバッグ出力をテキストでシリアル出力しているなら、バイナリダンプに変更して
ファイルに落とし、PCで加工して見るなどの工夫も手かもしれません。
後は、型が混ざる演算の暗黙のキャストにもご用心。
sudohayato
katsumata
2017年5月30日 16時09分
勝俣と申します。
> 浮動小数や平方根、三角関数を多用しているために演算に時間がかかっており、
私は三角関数の演算時間短縮が必要な場合は巨大なテーブルを使用しています。
テーブルを引くだけ、もしくは直線補間(演算量が若干増えますが、テーブルのサイズを小さくできます)。
最高速が必要なら0~5/2πまでテーブルを持たせてサインもコサインも一発。
時間に余裕があれば0~π/2までのテーブルを使い回し。
よろしくお願いします。