#9MUSASI33がとろい訳。(2006-01/26)
#9MUSASI33がとろい訳。(2006-01/26) ☆今日も一日MUSASI33を弄ってた。 (注:このDGENは1.00です。最新のDGENはもっとずっと進んでいます。 スキルがあり、開発をしたい方は開発者に直接コンタクトをとって下さい。 私は開発者とは全く関係のない第三者です。 あくまでこのページの話は実験用途(教育用)です。)
管理人二日、迷走してやっと理由が判った。 (過去の記事:MUSASI2.2ぢじゃなくてMUSASI2.0Aですね。 しかも一応020対応してるし、安定性は知らんが) 常識で考えれば良かった。 常識で考えれば、まずexec()を見る筈。 で、過去にも見た。 見たんだけれど、大体いっしょじゃん。と思い。構造を追いかけるばかりで、気がつかなかった。
MUSASI2.0AとMUSASI3.3は、(基本的に)殆ど一緒。 違いはクロックの方法だけ。
参考:クロック消費マクロ(部分) #define USE_CYCLES(A) m68ki_remaining_cycles -= (A) /* MUSASI3.3の 場合 */ #define USE_CLKS(A) m68k_clks_left -= (A) /* MUSASI2.0Aの場合 */
MUSASI2.0Aは、基本的にべた書きで、 消費クロックを計算している。 例:「各命令ルーチン(土壇場で)」 USE_CLKS(18); /* 18クロック消費 */
対するMUSASI3.3は、「命令ごとに用意されたクロックテーブル(自動作成)」を見ながら、 消費クロックを計算している。 例:「exec()共通ルーチンで(m68cpu.c)」 USE_CYCLES(m68ki_cycles[REG_IR]); 但し、DBcc命令など、辻褄の合わない所は、後で補正。(条件が成立/不成立でクロックが変わる) 例:「各命令ルーチン(土壇場で)」 USE_CYCLES(CYC_DBCC_F_NOEXP);/* クロック補正 */ 補正量はCPUの種類により異なる。68000の場合は、 #define CYC_BCC_NOTAKE_B -2 #define CYC_BCC_NOTAKE_W 2 #define CYC_DBCC_F_NOEXP -2 #define CYC_DBCC_F_EXP 2 #define CYC_SCC_R_FALSE 2 #define CYC_MOVEM_W 2 #define CYC_MOVEM_L 3 #define CYC_SHIFT 1 #define CYC_RESET 132 で全部。
結論から言うと、MUSASI2.0Aの場合は実行時「exec()」 命令テーブルしか見ない。これは、この前も話したとおり、 サイズが(64kb x 4)で、256kb。 MUSASI3.3の場合は、これに加えて、クロックテーブルも見る。 これは前記と同サイズ。で、256kb。訂正:charでした。64kB。(同日、18:55)
つまり、PSPのCPUのキャッシュを、クロックテーブルが圧迫して遅くなっている。 計算は速い。でも、キャッシュが圧迫されたら、遅くなるに決まってるだろ。って話。訂正:charのアクセスはとろいんでないかな?(同日、18:55) せめて、INT=PSPの場合long=32ビット。でないと。(PC(DOS/V)も事情は同じ)更に訂正:そう思ってintにしてみたけど、変わらず。(同日、19:05) とにかくMUSASI3.3を速くするためには、クロック関係に手を入れなければどおしようもない。 という事が判ったので、とりあえず保留という事にします。(またそのうち再開するかも)
で、MUSASI2.0Aにコアを戻して、例のBF03チェック。 この前(MUSASI2.0A/GCC4.0.0)
| OFF | 79~80fps |
| 補間付5512kHz | 72~73fps |
| 補間付11025kHz | 70fps |
| 22050kHz | 65~66fps |
| 44100kHz | 60~61fps |
| OFF | 78fps | -1~-2 |
| 補間付5512kHz | 71fps | -1~-2 |
| 補間付11025kHz | 68fps | -2 |
| 22050kHz | 64fps | -1~-2 |
| 44100kHz | 55~57fps | -6~-4 |
-1~-2
-6~-4