2009年7月5日日曜日

PSPのCPUキャッシュ周り

備忘録です。


キャッシュとは


メインメモリに対してCPUがかなり高速なのでCPUとメモリを直結するとCPUがメモリにデータを読み書きする時間が非常に無駄になります。

それを緩和するためにCPU内部に高速なメモリを持たせようというアイディアが古くからあり、その高速なメモリの事をキャッシュと言います。

普段は便利ですが、CPU以外のデバイス(PSPならGEやMEが該当)がキャッシュ上のデータを参照しようとすると困ったことになります。正しいデータはキャッシュ上にあるのに外部のデバイスはメモリ上の古いデータを読み取ってしまうので、最悪の場合ハングアップに陥ります。

で、その対策ができる関数が以下です。

CPUキャッシュ関連の関数一覧



  • sceKernelDcacheInvalidateAll

  • sceKernelDcacheInvalidateRange

  • sceKernelDcacheProbe

  • sceKernelDcacheWBinvAll

    • 用法、用途不明



  • sceKernelDcacheWritebackAll

  • sceKernelDcacheWritebackInvalidateAll

  • sceKernelDcacheWritebackInvalidateRange

  • sceKernelDcacheWritebackRange

  • sceKernelIcacheClearAll

    • たぶんsceKernelIcacheInvalidateAllと同じ?



  • sceKernelIcacheInvalidateAll

  • sceKernelIcacheInvalidateRange

  • sceKernelIcacheProbe


命名規則


Dcacheならデータキャッシュ、Icacheなら命令キャッシュが対象。

Writebackならキャッシュ情報をメモリに書き込む。Invalidateならキャッシュ内容を破棄。両方書いてある関数は両方行う。

Rangeなら範囲指定ができる。Allならキャッシュ内容全てが対象。

Proveは指定したメモリアドレス上のデータがキャッシュに存在するか確認できる。

注意事項


Rangeが最後についている関数は64byteアラインメントが取れているポインタと64の整数倍のサイズを要求してくる。

sceKernelDcacheWritebackRangeは正常に動作しないのでsceKernelDcacheWritebackInvalidateRangeを使うべき。

同様に正常動作しない関数があるかもしれないので、困ったらぐぐる

0 件のコメント:

コメントを投稿