2008年02月11日

結局アセンブラに走っているし

delphiのFastcallってあまり評価していなかったのだけれど
先日PerspectiveFovを作るのに何もマクローリン展開することもないので
仕方なくFPUを使ったのだけれど
Fastcallの場合浮動小数点命令はFPUスタックにおきっぱなしでいいようなので
ロスは関数呼び出し分だけでこれは結構良い。それでどうした!......
ラベル:Delphi
posted by Xo_ox at 21:00| Comment(0) | x86アセンブラ | このブログの読者になる | 更新情報をチェックする

2008年02月12日

ちょっと足踏みしてアセンブラに走ってみたり

delphiのFastcallってあまり評価していなかったのだけれど
先日PerspectiveFovを作るのに何もマクローリン展開することもないので
仕方なくFPUを使ったのだけれど
Fastcallの場合浮動小数点命令はFPUスタックにおきっぱなしでいいようなので
ロスは関数呼び出し分だけでこれは結構良い。
やればいくらでも最適化はできるけれどとりあえず足りない関数で一発でできるものだけ
FASTCALLで作っておこうと思った。
それでどうした!......
ラベル:Delphi FPU
posted by Xo_ox at 21:00| Comment(0) | x86アセンブラ | このブログの読者になる | 更新情報をチェックする

2008年02月13日

行列の積とかsseでやってみた。

行列の積とかsseでやってみた。
現実問題としてdelphiを使う以上アセンブラでの素ルーチンを否定する理由は無いので
じわじわと見直している。
行列の積なんてfor toループで3行ですむ内容だがもう少しましなものにしようと思った。
今使っているPCはPentium4でSSE2くらいまで使えるのだが
C3あたりはSSEどまりらしいのでSSEとFPUでまぁ何とかやってみようということにした。

ちなみに行列関連について単精度であればgpuで計算させると命令的には楽であることが分かった。
でも依存はちょっと危うい。
SSE3の方がユニット間の移動が楽そうだがもってすらいないのでパス。
とりあえず今回の結果はROTATION関数で確認を取っている。
それでどうした!......
ラベル:SSE 行列 Delphi
posted by Xo_ox at 21:00| Comment(0) | x86アセンブラ | このブログの読者になる | 更新情報をチェックする

2008年02月15日

ベクターの扱いが配列とSSEと前後と勘違いしていた。

結果として正しいものになっていたけれど
論理的に製作のプロセスの思考が間違っていることに気づいた。
xmmレジスタはリトルエンディアンでロードするが
ベクターやマトリクスはSingle型を順番に配置している。
頭の中ではxmmレジスタに順番に入っているつもりで組んでいたのだ。
それでどうした!......
posted by Xo_ox at 21:00| Comment(0) | x86アセンブラ | このブログの読者になる | 更新情報をチェックする

2008年02月28日

行列式をSSEでやってみる。

逆行列を求めるにはまず行列式を求める必要がある。
コードを書くのがめんどくさい。
斜めにかけるわけだが考えてみると一個ずらせばまっすぐになるからSSEで書けば
案外と短くなることにきづいた。
それでどうした!......
ラベル:行列式
posted by Xo_ox at 21:00| Comment(0) | x86アセンブラ | このブログの読者になる | 更新情報をチェックする

2008年03月07日

floattostrをSSEに変更したが

行列表示などにfloattostrを作っていたのだが
つい魔がさしてSSE化した。んなこたぁしなくてもいいのにぃ。
しかし現時点で不完全であることに気づいた。
但し基本的にはFPU版も同じ欠点を持っていたので置き換えられる。
とりあえずSingleでは整数化などでFPU制御ワードとか使わなくて良くなった。
完全版はいろいろなものも集約して後日ということで多少なりとも参考にはなるだろうから
記録しておく
それでどうした!......
ラベル:SSE
posted by Xo_ox at 21:00| Comment(0) | x86アセンブラ | このブログの読者になる | 更新情報をチェックする

2008年03月09日

単精度算術関数を増やす

floattostrでなんか使用技術がちぐはぐなのでとりあえず
あまり長いコードはかかずに汎用関数をまとめることにした。
それでも現時点のexeサイズは25kbyteもある。
小数点以下の桁の処理で10ベースの指数と対数の処理が必要なのだが
意外と苦戦した。
あと専用の領域を使うことを前提としたので互換性のための一部の関数以外は
constからvarに変更してスタックは極力使わないようにしている。
それでどうした!......
ラベル:FPU
posted by Xo_ox at 21:00| Comment(0) | x86アセンブラ | このブログの読者になる | 更新情報をチェックする

2008年03月12日

Direct3DとFPU精度とコントロールワード変更について

Direct3DではデフォルトでFPUを単精度に落としてしまうため
アプリケーション内部で倍精度演算をしていても精度が落ちる。
通常は単精度のデータをFPUにぶち込んでも自動的に10byte超演算になるので
特に整数ベースのデータの場合精度が保たれるのだが事後処理をしないと
常識的な値すら崩れるケースがある。
そんなに興味があるわけでは無いので積極的実験はしていないが
せっかく探索して理解したので自分の見解とコードともにメモしておきたい。
それでどうした!......
ラベル:Delphi Direct3D9 FPU
posted by Xo_ox at 21:00| Comment(0) | x86アセンブラ | このブログの読者になる | 更新情報をチェックする

2008年03月16日

FPUモード変更を呼び出さず短くまとめてみる。

FPUモード変更時、delphi6は特にハンデ無く「Set8087CW」と「Get8087CW」を使えるが
マクロでは無いので呼び出しコストが割高になる。いっそのこと一行で書いてみた。
その他delphiのアセンブラの癖を確認した。
それでどうした!......
ラベル:FPU
posted by Xo_ox at 21:00| Comment(0) | x86アセンブラ | このブログの読者になる | 更新情報をチェックする

2008年03月18日

算術ルーチンをぐだぐだとFPUよりに修正

数値直接主義だったが言語が変数をレジスタでアクセスできる仕様であり
ポインタ型の間接参照はできないようなので
$133fとか0.5などの数値を変数で持たせて効率が良い場合はそれを使うことにした。
コントロールワードの変更も大してハンデは無いみたいなので
SSE経由での切捨てもやめてFRNDINTとfldcwを使うことにした。
あとdelphiの呼び出し規約だとFunctionはFPU渡しのようなので関数はFPUでの操作にとどめてみることにした。

はっきりいって現状ベストには程遠い気がするチェックは甘いが
べき乗とかlogとかないとどうにもならないのでとにかくまとめなおした。
それでどうした!......
ラベル:FPU
posted by Xo_ox at 21:00| Comment(0) | x86アセンブラ | このブログの読者になる | 更新情報をチェックする
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。