Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

性能目標未達(M5Stack) #17

Open
suzukiplan opened this issue Jul 12, 2023 · 7 comments
Open

性能目標未達(M5Stack) #17

suzukiplan opened this issue Jul 12, 2023 · 7 comments
Labels
bug Something isn't working M5Stack

Comments

@suzukiplan
Copy link
Owner

性能目標が未達成:

  • 目標: tick 2 frames < 33ms
  • 現状: tick 2 frames = 41ms (min:34, max:52)

1フレームあたりで換算すると次の通り:

  • 目標: tick 1 frame < 16ms
  • 現状: tick 1 frames = 20.5ms (min:17, max:26)
@suzukiplan suzukiplan added M5Stack bug Something isn't working labels Jul 12, 2023
@suzukiplan
Copy link
Owner Author

PSG を削除し、VDP の レンダリング処理をスキップした状態(つまり、ほぼ Z80 だけ動かした状態)にしても約35ms(28/30fps)と目標達成が微妙にできていない。

PSG + VDP レンダリング は 2フレームあたり 6ms 程度(3ms程度)でそろそろ最適化余地が限界に達しつつある。

最適化余地があるとすれば Z80 エミュレーション...と、あとは esp32, FreeRTOS or M5Stack 固有のチューニング余地がある何かだが、それについても万策尽きつつあるかも。

@suzukiplan
Copy link
Owner Author

esp32 のマニュアルにパフォーマンスに関する記述がある

https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/performance/index.html

上記には「実行速度」「バイナリサイズ」「RAM使用方法」の3つの観点からのアドバイスが書かれている。

実行速度

全体的な速度向上

CONFIG_ESPTOOLPY_FLASHFREQ を80MHzに設定する

  • デフォルト: 40MHz
  • フラッシュからコードがロードされたり実行されたりする速度が2倍になる
  • この設定を変更する前に ESP32 をフラッシュ・チップに接続するボードまたはモジュールが関連する温度範囲で 80 MHz 動作に対応していることを確認 する必要がある
  • この情報はハードウェアのデータシートに記載されている

これについては既に設定されているっぽい。

#23 のログ情報に APB: 80000000 Hz という出力があるので、既に80MHzモードになっている筈。

[    10][D][esp32-hal-cpu.c:244] setCpuFrequencyMhz(): PLL: 480 / 2 = 240 Mhz, APB: 80000000 Hz

CONFIG_ESPTOOLPY_FLASHMODEをQIOまたはQOUTモード(Quad I/O)に設定

  • デフォルトのDIOモードに比べ、フラッシュからのコードのロードまたは実行速度がほぼ2倍になる
  • 両方がサポートされている場合、QIO の方が QOUT よりもわずかに高速
  • フラッシュ・チップのモデル、ESP32とフラッシュ・チップ間の電気的接続の両方がクアッドI/Oモードをサポートしていなければ SoC は正しく動作しない

試しに platformio.ini で、

board_build.flash_mode=qio

を指定してみたが、特段動作速度に変化はなかったので既に設定済みだと思われる。

CONFIG_COMPILER_OPTIMIZATION を Optimize for performance (-O2) に設定

  • デフォルトの設定よりもバイナリ・サイズが若干大きくなるがほぼ確実に一部のコードのパフォーマンスが向上
  • コードにCまたはC++の未定義動作が含まれている場合、コンパイラの最適化レベルを上げると、他の方法では見られないバグが露呈する可能性がある

既に非推奨の -O3 相当(-Ofast)で速度が足りてないのですが...

CONFIG_ESP32_REV_MIN を 3 に設定

  • アプリケーションが PSRAM を使用しESP32 rev. 3 (ECO3) をベースとするアプリケーションの場合、この設定により PSRAM バグの回避策が無効になるため、コードサイズが小さくなり、全体的なパフォーマンスが向上

#23 で PSRAM は完全 OFF にしているので関係ない...

浮動小数点演算フロートの使用を避ける

  • ESP32が単精度ハードウェア浮動小数点ユニットを備えていても、浮動小数点計算は常に整数計算よりも遅くなる
  • 固定小数点表現、別の整数表現方法を使用するか、計算の一部を整数のみに変換してから浮動小数点に切り替えることで高速化が見込める

floatdouble も完全排除済み...

倍精度浮動小数点演算倍数の使用を避ける

  • これらの計算はソフトウェアでエミュレートされ非常に遅い
  • 可能であれば、整数ベースの表現か単精度浮動小数点 (float) を使用すること

floatdouble も完全排除済み...

とりあえず全体最適化の余地はもう無い感じっぽい

@suzukiplan
Copy link
Owner Author

#25 にて大丈夫な感じになった

@suzukiplan
Copy link
Owner Author

現状 46〜48fps ぐらいの性能

@suzukiplan
Copy link
Owner Author

CoreS3 では 48〜50fps ぐらいの性能(若干程度早くなった)

@suzukiplan
Copy link
Owner Author

suzukiplan commented Jul 22, 2023

チャンピオンデータ(56fps)

image

とあるゲーム(グラディウス)のタイトル画面で瞬間的にマークした(あと、なぜがグラディウスは全般的にスコアが良くて、50〜52fpsぐらいを安定的にマークしている)

@suzukiplan
Copy link
Owner Author

ゲーム側の実装依存の部分が結構あるかも。

例えば、垂直同期割り込み待ちをする時にJPでぐるぐる回すより、HALTを発行した方がエミュ側の負荷が軽くなりそうです。HALTを発行すると、内部的にはPCのデータを読み捨てる(4Hz ※M1相当だからMSXだと5Hz?)動作をしますがPCがインクリメントされない形になるので、キャッシュミスヒット率が下がりつつ、トータルのネイティブ命令実行数が少なくなるので。

エミュサイドとしては手の入れようが無いなぁ...(垂直同期待ちかどうかを実行コードから動的に判断するのはオーバーヘッドが大きいので、やるならコードをスタティック解析して書き換える感じだが想定外のデグが起こりそうなので原則元コードはエミュ側ではイジらないスタンス)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working M5Stack
Projects
None yet
Development

No branches or pull requests

1 participant