2016年1月6日水曜日

[gcc, spu] spu版gcc最適化問題(5)

2004年作成

問題を回避する手段


今まで提出した問題の回避方法について記述します。
番号は[SPUコンパイラ最適化項目]と同じものです。

回避可能な問題に関してのみ記述します。

変数のstore処理の無駄

vector 以外のデータ構造のアクセスではどうしてもメモリからデータを読み込み、ch 系の命令でシャッフル用の情報を作り、シャッフルで値を設定しストアします。
vector型を代わりに使用すれば、回避できます。
既にfor文のindex変数等はやっています。

ループ最適化

vector型を代わりに使用すれば、回避できます。

除算

除数が定数の場合、最適化しないという問題ですが、除算を使用せず、シフト命令等で処理すれば回避できます。

整数演算の順序

複数の加算、乗算を行う場合、乗算を前から順に行うと前の演算の結果を待つため、処理が遅れる場合があります。
処理の順序を括弧で指定することで回避することが可能です。

インライン展開時のスタックポインタ処理

インライン関数ではなくマクロで処理する。

変数のstore処理の無駄

vector型を代わりに使用すれば、回避できます。

シャフル用のベクタに関して


const vec_uchar16 vec = (vec_uchar16)
{
0x0c, 0x0d, 0x0e, 0x0f,
0x0c, 0x0d, 0x0e, 0x0f,
0x0c, 0x0d, 0x0e, 0x0f,
0x0c, 0x0d, 0x0e, 0x0f
}

上記のようなベクタはメモリから読み込まないで、コード上で作成されます。
よって、定義していると無駄なデータ領域になります。

コードでは

ilhu $109, 0x0c0d 上位16ビット指定
...
iohl $109, 0x0e0f 下位16ビットをor
で作成されます。

vec_uchar16 l = { 0x00, 0x01, 0x02, 0x03, 0x08, 0x09, 0x0a, 0x0b,
                  0x10, 0x11, 0x12, 0x13, 0x18, 0x19, 0x1a, 0x1b };
vec_uchar16 r = { 0x04, 0x05, 0x06, 0x07, 0x0c, 0x0d, 0x0e, 0x0f,
                  0x14, 0x15, 0x16, 0x17, 0x1c, 0x1d, 0x1e, 0x1f };

のような計算で他のベクタが求まるような情報がある場合、

il $4, 0x0404
add $4, $5, $4

にしても命令は増えますが、サイクル数は同じです。さらに定数部の 16 バイトが削れます。
しかし、現在は定数計算をしてしまうようで、結局同じようなコードになってしまいます。

シャッフル用のベクタテーブルは結構多いようなので、一つのモジュールでまとめた方が良いと思います。

0 件のコメント:

コメントを投稿