PSPでPS1ソフトをPSPとともに楽しむ#5で公開したぷろぐらむ。あれはまだシングルスレッドなんですよね。まぁ、マルチスレッドの場合、最適化が一番のネックなわけです。とくに、複数のスレッドで同時に作業させるには、きちんとしたスケジュールをくまないといけません。そしてマルチスレッドに分割した場合、順番がことなって出力されては意味がないことも往々にしてあります。
そこで、PS3FreePops34-103のソース元に、マルチスレッド化による高速化の実験をちょっと行ってみました。マルチスレッド化してもっとも有用な部分は、ZLIBの圧縮部分であることは容易に想像できるでしょう。この部分が、同時に複数のCPUで計算できたらどれだけはやくなることか・・・w というわけで、この部分ダケではありますが、そこに絞って高速化の研究をすすめてみます。
さて、とはいっても、まずは二つのスレッドに分割してみることにしました。というのも、現在はデュアルコア・デュアルスレッドまでのCPUが一般的ですしね。なので、まずはGUI側のコントロールスレッドと、ZLIBのワーカースレッドに分離してみることにします。
その結果は、デバッグ中の画面ではありますが、以下のようにCPUの利用可能帯域がマルチスレッド化したときにはいっきにふえています。それだけ、CPUの単位時間あたりの使用効率があがっているということですね。これは、圧縮時間の短縮がそれだけなされたとみなすこともできるでしょう。
とはいえ、これは特定の環境でおこなったテストにすぎないです。2コア2スレッドCPUや、1コア2スレッドCPUなど、物理プロセッサがどれだけ有効にスレッドを処理できるかで、まったくかわってきます。また、デバッグモードでの実行試験のグラフでしかありませn。まぁ、研究の余地はまだまだあるな~
まぁ、近いうちに、マルチスレッド化したバージョンをたぶん公開しますが、まずは4コア(GUI&管理スレッド+圧縮3スレッド)ぐらいにわけたいかな~とかおもっています。
シングルスレッドモデル
マルチスレッドスレッドモデル(2スレッド)