« 論理コア数32以上のCPUで動画再生時エラーが出る問題 | メイン

2017年10月18日

吉里吉里Z 開発:: 32コア問題をソースコードレベルで少し追う

    

環境が準備出来る前にソースコードレベルで何か怪しいところはないか少し調べてみた。

怪しいのは、定数「MAXIMUM_PROCESSORS」である。
この定数は、「MAXIMUM_PROC_PER_GROUP」になっていて、MAXIMUM_PROC_PER_GROUP は、_WIN64 が定義されていると 64、それ以外は 32 となっている。
つまり、32bit 版吉里吉里Z はコア数 32 を上限として処理している。
64bit 版は 64 になる。
SetThreadIdealProcessor では、「優先プロセッサがない場合は、MAXIMUM_PROCESSORS が返ります。」と書かれている。
MAXIMUM_PROCESSORS が 32 で、論理コア数も 32 。
どこかミスして潜在的な不具合があってもおかしくない。
Windows7 からは、SetThreadIdealProcessor の代わりに SetThreadIdealProcessorEx が使えるようだ。

吉里吉里2/Z は描画のマルチスレッド化の際、コア数を GetSystemInfo で取得している ( マルチ版ではstd::thread::hardware_concurrency() に変更 )。
SYSTEM_INFO.dwNumberOfProcessors は論理コア数なので、32 になるはずである。
ただ、内部の定数で 8 を上限としているので、描画スレッド数は最大 8 になるように書かれているように見える ( 私が書いたところではないので、8 はマジックナンバーで意図は不明 ) 。

不具合がありそうに思えるのは、定数「MAXIMUM_PROCESSORS」が絡むところだけれど、実際に何が問題を起こしているのかは、実際の環境で動かせないことには特定しづらい。


投稿者 Takenori : 2017年10月18日 19:46




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