L.Entisの日記: 3D高速化・高精度化
日記 by
L.Entis
自前ライブラリの3Dソフトウェアレンダラの、高速化と、高精度化を微妙に進めようとちまちま作業を進めているのですが、ふと、PC9801時代に、12MHzとかでよく3Dとかやれてたよなと、昔のコードを思い出してみたりした。
よくよく考えると、386, 486 時代と、P5 アーキテクチャ、P6 アーキテクチャでは全然違ってたりするんですよね。
昔は、自己書き換えコードとか普通に使ってましたもんね。
まあ、自己書き換えが有効なのはせいぜい486位までで、586(Pentium)以降は、命令キャッシュをぶち壊すし、P6(Pentium Pro)だと場合によっては見込み実行までぶち壊すんで全然よろしくないのですが。
(386時代にも命令先読みキューの問題はありますが、さすがにそんなに近い場所を書き換えることはないし、近い場合にはジャンプ命令を入れる(たいていの場合ループの開始場所へ(ついでに16バイト境界))ので大した問題ではないのです)
因みに、自己書き換えってどんなことやるの?って簡単に説明すると、色々な種類があるのですが、一番多いのが、即値オペランドの書き換えですかね。
命令コードの書き換えもやることもありますが。
ループ前のセットアップ処理で、変数に書き込む代わりに命令の即値を書き換えるわけです。で、ループの中で実行されるときには、メモリへアクセスすることなくその変数の値で実行されるわけですね。
そうすると、メモリアクセスだけでなく、レジスタも節約できるわけです。
よくよく考えると、386, 486 時代と、P5 アーキテクチャ、P6 アーキテクチャでは全然違ってたりするんですよね。
昔は、自己書き換えコードとか普通に使ってましたもんね。
まあ、自己書き換えが有効なのはせいぜい486位までで、586(Pentium)以降は、命令キャッシュをぶち壊すし、P6(Pentium Pro)だと場合によっては見込み実行までぶち壊すんで全然よろしくないのですが。
(386時代にも命令先読みキューの問題はありますが、さすがにそんなに近い場所を書き換えることはないし、近い場合にはジャンプ命令を入れる(たいていの場合ループの開始場所へ(ついでに16バイト境界))ので大した問題ではないのです)
因みに、自己書き換えってどんなことやるの?って簡単に説明すると、色々な種類があるのですが、一番多いのが、即値オペランドの書き換えですかね。
命令コードの書き換えもやることもありますが。
ループ前のセットアップ処理で、変数に書き込む代わりに命令の即値を書き換えるわけです。で、ループの中で実行されるときには、メモリへアクセスすることなくその変数の値で実行されるわけですね。
そうすると、メモリアクセスだけでなく、レジスタも節約できるわけです。
3D高速化・高精度化 More ログイン