« CPU判定処理の結果など | メイン | 吉里吉里Z 64bit(SSE2/AVX2)対応クラウドファンディング »

2016年01月07日

吉里吉里Z 開発:: 64bit 対応で必要な作業

    

必要な作業をざっくりまとめると以下のような内容、工数もおおよそ。

1. プロジェクトの設定と最小限ビルド通る状態 (済み)
2. プラグイン読み込みフォルダ変更 (済み)
3. SIMD 版 libjpeg から libjpeg-turbe への置き換え (1日未満)
4. グラフィック周りのアセンブリをイントリンシックで置き換え (1ヶ月)
5. Phase Vocoder をイントリンシックで置き換え (数日)
6. WAVE の 16bit float 変換がある部分のアセンブリをイントリンシックで置き換え (数日)
7. 例外発生時の CPU ダンプ周りの確認 (1日未満)
8. krmovie.dll の 64bit 対応 (数日)
9. wuvorbis のインラインアセンブリをイントリンシックで置き換え (1週間)
10. extrans のインラインアセンブリをイントリンシックで置き換え (数日)
11. その他プラグインの 64bit 対応 (数日~)
12. FPU 周り (1日未満)
13. ワーニングの確認 (数日)
14. 互換性のテスト

1. 通るようにした後、menu プラグインの対応も行った。
ポインタサイズの int 型 tjs_intptr_t と tjs_uintptr_t を追加したので、ポインタを整数に入れる場合はまずこの型にキャストする。
menu プラグイン対応で、いくつかのポインタの受け渡しで int 型へ変換されていたので、うまく動かなかった ( Windows.HWND/registerMessageReceiver など)。
tjs_intptr_t にキャストしてから Variant に入れるように修正してうまく動くように。

2. 64bit 版の場合 plugin64 フォルダからプラグインを読み込むようにして、32bit 版と共存できるようにする。
exe フォルダ、system フォルダ、plugin/plugin64 フォルダで読み込まれるので、両対応にするために plugin/plugin64 フォルダにのみプラグインを置くのを推奨することになる(両対応するのなら必須)。
そうしないと 64bit 版で 32bit プラグイン読んでしまって動かなかったりする。
前回同様 dev_64bit ブランチに入れた。

3. ライブラリの差し替えと、API が大きく違うのでそれに対応する。
libjpeg 互換 API もあるが、専用 API の方が速いようなので。

4. 一番作業量が多い。
簡易的に C へ変換するスクリプト書いたので、それにかけたのち細かいところ修正して MMX 版のソースコードを作り、可読性を考えたものへリファクタリング、その後 SSE2、AVX2 版を作る。
C 版から直接書き換えてもいいが、アセンブリ版から書き換えた方が効率が良さそう。
オリジナルと結果が異ならないようにテストコードを通して、随時確認している。
64bit 環境では、SSE2 が使える前提なので、MMX 版は不要。
確認するとイントリンシックで書いた MMX 版はだいぶ遅くなってしまう、SSE2 は期待するくらいの速度。
32bit 版で、MMX を残すかどうかは迷うところだけど、従来のアセンブリ版はおいておいていいかもしれない。
AVX2 は、使用頻度が高そうなもののみで問題ないか。
ブレンド処理で、PS系ではない通常の加算、減算、乗算、覆い焼き、比較(明)、比較(暗)、スクリーン乗算は、優先度低いと思われる。
アセンブリの MMX 版でもすべて実装されているわけではない。
AVX2 使うソースコードには、コンパイルオプションの指定を忘れずに。

5、6. は、アセンブリだけどCで書かれたオリジナルがありそう。
吉里吉里3に入っているものを少し書き換えることで対応できるかもしれない。
Phase Vocoder は優先度低いかも。

7. レジスタサイズなどが異なるので修正済みだが、正しい出力が出るかどうかは未確認。
出力確認の必要がある。

8. プロジェクトに 64bit 構成追加するのみで行けると思われるが、libogg,libtheora,libvorbis などで作業が必要かもしれない。
出力フォルダを bin/win64/plugin64 にする必要もある。

9. インラインアセンブラで SSE 対応など記述されているので、それを書き換える必要がある。
Ogg Vorbis 高速化プロジェクトから対応部分を持ってくることで対応可能かもしれないが、高速化プロジェクトは、別バイナリで対応する方式なので切り替え部分を作る必要がある。
64bit では Vorbis やめて opus に絞るのもありかもしれない。

10. インラインアセンブラで MMX 対応などされているので、それをイントリンシックに書き換える必要がある。

11. 基本的にプロジェクトに 64bit 構成を追加するのみだが、Win32 API 等一部修正が必要かもしれない。
出力フォルダを bin/win64/plugin64 にする必要もある。

12. 吉里吉里Z 64bit版試作で、FPU がどうこう書いたが、64bit 環境では FPU ではなく、SSE が使われるので、単純無効化で問題なさそう。

13. 64bit 化で大量にワーニングが出ているので、問題となるものがないか確認する。
例えば文字列長でポインタの end - start で求めた長さを int に入れる、size_t を int に入れるなどしているものがある。
問題とならないものは、キャストするなどワーニングを抑止し、問題が出そうな箇所については修正を入れる必要がある。

14. 対応完了後、32bit 版と同じように動くか確認し、問題があれば修正する。


その他
messenger プラグインで、32bit 版と 64bit 版で通信した時、64bit から 32bit へ送ると切り捨てが発生するのでその辺りのチェック。
Variant 型からポインタ変換している辺りで問題があるかも(ほとんどはint64にしてから入れているので大丈夫なはず…… menu プラグイン対応してみたらだいぶダメだった)。
Win32 API 周りで問題があるかも。


投稿者 Takenori : 2016年01月07日 02:55




comments powered by Disqus
Total : Today : Yesterday : なかのひと