tt (2867) の日記
[lame]G4ってよくわからない
「もしかしたらちょっとは速くなるかなー」とおもって、浮動小数点計算を似非固定小数点化により整数計算に変更するというコードを先週末ぐらいに書いたのですが、残念ながらPentium3とかではほとんど結果に違いがありませんでした。
ということで元に戻そうかと思ってたんですが、念のためいろんなプラットフォームで動作確認したところ、なんとG4上でのみ30%以上の高速化が!!!えええええってかんじ。
もしかして、G4って(Altivec使わないと)浮動小数点計算は激遅なんでしょうか…またはgccがバカという可能性もあるわけですが。
とはいえ、Altivec他を使うことなく、速度がかなり改善したのは確か。風呂デバグの成果とあわせて、今月はじめの段階で18.9secかかっていた処理がいまや10.4secです。倍近い。すばらしい。
この数字はいろんな楽曲をくっつけて作った90.5秒のテスト音源を、cf.sf.netにあるG4 800MHzでVBRエンコードするのにかかった時間なのですが、ここから逆算すると一倍速エンコードに必要なクロック数は92MHzとなります。G5 1.8GHzで21倍速ぐらいという数字や、G4とG5の効率の違い他を考えれば、多分、いまやLAMEのほうがiTunesより速い、、、、、のかもしれない(いやでもLAME4はほとんど音質に関するチューニングをしてないので、iTunesより音質が劣る気もしますが)。
あとG4でLAMEを動かしたとき、実行時間の17%はsqrt()関数だったりします。sqrt() は非線形量子化で使う x^(3/4) の計算に使っているのですが、ここは非常に容易にVector化できるので、とりあえずここをAltivec化してみようかなと。この部分はSSEとか3DNow!化することで10倍速ぐらいになっているので、Altivecでも同じぐらいの成果を期待できるのではないかと思ってます。
PPCで平方根 (スコア:0)
で、AltiVecを使うとG4でも高速に逆数平方根が求まりますが、確か精度が悪い(10bitぐらい?)と思ったので、もしかしたら使い物にならないかもしれません。
参考になるかわかりませんが一応。
Re:PPCで平方根 (スコア:1)
どうもAltivecの逆平方根は精度12bitぐらいみたいです。16bit精度の3DNow!とかと違い、これで3/4乗を計算するには、Newton法を2回やら無いとダメっみたいです。多分、それでも速くなるだろうけど、汎用性がないくせにゲインが少なく、余りおいしくないっぽいです。個人的にはボツかなあと。
そんなわけで現在、むかし私がまだCeleron300A(@464MHz)を使っていたころ、午後のこ~だのコードを参考にして書いた、級数展開でx^3/4を計算するコードを復活させて動作を検証しております。
-- Takehiro TOMINAGA // may the source be with you!