問題を回避する手段
今まで提出した問題の回避方法について記述します。
番号は[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 件のコメント:
コメントを投稿