2017 年に Ryzen が発売されてから、もたついている Intel を尻目に AMD がイケイケです。
Ryzen のマイクロアーキテクチャである Zen シリーズのプロセッサでは、以下のような特徴があります。
- AVX2/BMI1/BMI2 命令セットを新たにサポートした。
- Zen/Zen+ アーキテクチャの Threadripper や EPYC では、内部的に複数のダイで構成されており、1ソケットであっても弱い NUMA 性を持つ。(Zen2 は構造が異なり、複数ダイではあるが NUMA 性を持たない)
- Zen+ ではプロセスルールが進んで集積度が上がり、1ソケットで64スレッドを超える EPYC が登場した。(EPYC 7552 などが48コア96スレッド、EPYC 7702 などが64コア128スレッド)
- Zen2 の Threadripper ではワークステーション向け CPU として恐らく初めて1ソケットで64スレッドを超えた。(Threadripper 3990X が64コア128スレッド)
メモリアクセスの激しいアプリケーションを NUMA システム上で動かす場合は NUMA を考慮した作りにする必要があります。また、Windows において64論理プロセッサを超えるシステムではプロセッサーグループという概念が登場し、1つのアプリケーションプロセスで全ての論理プロセッサを使うにはそれを考慮した作りにする必要があります。
そんな Ryzen (Zen シリーズマイクロアーキテクチャ)に関わる Q&A です。
そもそも Ryzen 持っていますか
持っていません。
友人が Ryzen 9 3900X を持ってるのでちょっとしたテストのお願いならできるかもしれませんが、がっつりベンチマークみたいのは無理です。
UtVideo は Zen アーキテクチャに最適化されていますか
Ryzen を持っていない(=ベンチマークしたことが無い)ので厳密なところは分かりませんが、以下のような認識をしています。
- ULxx と UQxx は恐らく問題はない。
- UMxx はパフォーマンスにかなりの問題がある。
UMxx では AVX2/BMI2 が使える環境だと PEXT/PDEP 命令を使うようになっていますが、 Zen だと PEXT/PDEP がものすごく遅いため、大幅に遅くなると考えられます。演算ユニットが 128bit のままである Zen/Zen+ だけでなく、 256bit 化された Zen2 であっても、下手をすると AVX2 を使わないルーチンで動かした方が速いかもしれません。
UMxx の中で使っている PEXT/PDEP 命令をもっと速い同等の処理に置き換えることは可能ですが、単純に置き換えると Intel のプロセッサでは逆に遅くなるので採用できません。 Zen シリーズアーキテクチャの場合にのみ置き換えるのが適切ですが、マイクロアーキテクチャに基づいてルーチンを選択する仕組みは実装されていません。あと、そもそも置き換えたものが AVX2 を使わないルーチンより速いかどうかも分かりません。
UtVideo は NUMA を考慮した作りになっていますか
なっていません。
Zen の1ソケット構成での弱い NUMA 性だとどうなるか分かりませんが、Xeon E5 の2ソケット構成のような NUMA システムにおいて、想定される速度よりかなり遅いという報告を受けたことがあります。理論的な回避方法はともかく、そういったシステムは高価なので手が出せず、検証できません。
UtVideo はプロセッサーグループを考慮した作りになっていますか
なっていません。
プロセッサーグループの場合は NUMA の場合とは別の方向で話が面倒です。複数のプロセッサーグループにまたがったプロセス内では一部の API の挙動が変化するのですが、そのようなプロセス空間にプロセッサーグループを考慮していないコーデックが読み込まれる可能性があり、その場合にコーデック側がどういう挙動になるのか予想が付きません。やはりシステムは高価です。(一番お手軽な Threadripper 3990X ですら CPU 単体で50万円する)
なお、プロセッサーグループを考慮しない(=単一のプロセッサーグループで動く)アプリケーションのプロセス空間内で UtVideo を使う場合は、仮にシステムの論理プロセッサ数が64個を超えていても問題はないはずです。
競合コーデックでは上記の点はどうなっていますか
競合コーデックというと、いつもの AMV4 と MagicYUV になると思います。これらの作者ではないしソースコードも公開されていないので推測になります。
まず AMV4 ですが、最新バージョンである 4.10 (2017年4月)で CPU 設定に “ZEN” が追加されています。ただし、現時点では “ZEN” は “SSE4.1” と同じであり、単に今後 Zen シリーズに最適化されたルーチンが追加された場合はこの設定をすると有効になるという表明をしただけにすぎません。また、AMV4 はシングルスレッド動作しかしないコーデックであるため、NUMA やプロセッサーグループはそもそも無関係です。単に呼び出しスレッド上で処理をして結果を返すはずです。
MagicYUV の方は、ChangeLog を見る限り Zen シリーズについては何も述べていません。また、同様に NUMA システムやプロセッサーグループについても言及していませんし、DLL のインポートテーブルを見ても関連する API は見当たらないので、考慮していないものと思われます。GetProcAddress はインポートしているのでそれ経由で呼び出している可能性は考えられますが、NUMA サポートは Windows XP の時点で既に存在しているのでそんなことをする必要は無く、まあ「無い」でしょう。
no comment untill now