PSPであそぼう(10)

PSPAPI
http://pspdev.ofcode.com/api.php
で解析が進んでいる。Mathのなかには、sceFpuSinやらsceFpuCosやらがあって、いかにも計算が速そうに見える。ところが、案外そうでもない。


ここまで読んでもらえれば既におわかりだと思うが、FPU自体にSinやらCosやらを直接的に求める機能は備わっていない。そんな命令は無いのだ。無ければどうするのか?Sin,Cosの演算精度が粗くていいならテーブルを使うだろうが、引数はfloatだろうから、ここはもう級数展開するしかない。級数展開した係数を掛け合わせる部分にFPUを使えなくはないが、たかだか4,5回の掛け算と足し算にFPUを使うと余計に遅くなりかねない。(64bitの精度で計算するなら事情が少し異なる)


Sinテーブルをrubyなどで生成して「sceFpuSinやらsceFpuCosを使えば、FPUを使った演算ですごく速く結果が求まるだろうになぁ」なんてお嘆きの諸兄に朗報だ。そんなことは全然ナイということだ。Sinテーブルをlook upするほうがはるかに速いし、rubyでSinテーブルを作る行為は全然馬鹿げてなんか居ない。自信を持つのダ!(`ω´) まあプログラムでsceFpuSinを呼び出して動的に作ったほうがいくぶんスマートでプログラムサイズは減るだろうけど。


そんなわけで、FPUが真に効力を発揮するのは、並列的で連続的な数値演算(主に四則演算)が必要なシーンだ。そういうシーンで使っていただきたい、ということでFPUの解説はこれにて終わる。質問はコメント欄にて受け付ける。