Ryzen マルチスレッド処理
■Ryzen(マルチスレッド)の概要

Ryzenには1つのCPUコアで2つのスレッドを動作させるSMT(Simultaneous MultiThreading)と言う仕組みがあります。
また、4つのCPUコアを一つのパッケージとしたCCX(Core Compulex)という構成になっています。
このCCXを2つ搭載することでRyzen 1800Xは8コア16スレッドとして動作します。
【参考記事 PC Watch】 AMD「Ryzen 7」の半導体チップの姿
論理プロセッサ | タスクマネージャ上のCPU0とかCPU1のこと。 |
コア | CPUコアとか物理プロセッサと呼ばれる部分。SMTの場合、一つのコアに2つの論理プロセッサがあります。 |
CCX | 4コアを一つのパッケージとしたもの。 |
■テスト方法
AMV2 MT ビデオコーデックを4スレッドでエンコード、およびデコードするように設定し、処理時間(FPS)をCPU(論理プロセッサ)の割り当てを変えながら計測していきます。
論理プロセッサの割り当てについてはCPUマスクと表記し16進数で示します。
■結果
CPU マスク | Encode FPS | Decode FPS |
0x000F | 1402 | 1497 |
0x0055 | 1880 | 1866 |
0x00FF | 1898 | 1861 |
0x0303 | 1230 | 1456 |
0x0505 | 1597 | 1849 |
0xFFFF | 1611 | 1847 |
■考察
最もいい結果となったのは0x0055と0x00FFです。0x0055については4スレッド分の処理を行う場合の理想的な割り当てなので、納得です。
また、0x00FFでもほぼ同等の性能を発揮したのでこのテストにおいてはOSによる自動割り当ても十分優秀と言えます。
一方0x000Fは2コア分のリソースしか使えないところに4スレッド分の処理を詰め込むためパフォーマンスが低下しています。0x0055と比べエンコードで約25%減、デコードで約20%減。
そして、Ryzenを使う上で気になるのが後半の3パターンです。
CCXをまたがって処理すると(CCXをまたがらない場合に比べ)エンコードで約15%減、デコード処理では著しいパフォーマンスの低下は見られませんでした。
0x0303はCCXをまたがり且つ2コア分のリソースしか使えないため最悪の結果となり、0x0055と比べエンコード処理は約35%減となっています。
以上より、CCXをまたがってマルチスレッド処理を行う場合、パフォーマンスが低下するプログラムと、CCXをまたがっても低下しないプログラムがあることが解ります。
0xFFFFは既定の動作なのでRyzenを普通に使っているとマルチスレッドで処理するプログラムの場合にCCXをまたがって10%程度パフォーマンスが低下する場合があるかもしれません。
【参考記事 PC Watch】 Windows 10はAMD Ryzenの論理コアを正しく認識できず、性能が下がる?
Ryzen 1800X 、 Core-i7 7700K 可逆圧縮ベンチマーク
シングルスレッド処理における各CPUの性能やSSE命令およびAVX2命令の挙動を見ていきます。
■テスト方法
動画ファイル Mystery of the Nile (こちらのサンプル動画1)を1280 x 720、YUY2の未圧縮に変換。
その動画ファイルをAMV4ビデオコーデックのDY3設定でエンコード、デコードした際の処理時間(FPS:一秒間に何フレーム処理できるか)を計測します。
両CPU共、動作クロックはRyzenの定格である3.6GHzになるよう設定。
メモリの動作クロックも両方とも2133MHzに設定し、なるべく同じ条件でテストします。
■テスト環境
OS | Microsoft Windows 10 Home 64-bit |
CPU | AMD Ryzen 7 1800X 3.6GHz (100MHz x 36) |
MB | MSI B350 TOMAHAWK |
Memory | DDR4 16GB (8GB x 2 Dual channel) 2133MHz |
備考 | CPUは8コア、16スレッド、AVX2対応。動作クロックをBIOSにて全コア3.6GHz(定格)に設定しましたが アイドル状態になると3.1GHzまで低下します。テスト中はほぼ3.6GHzで動作しますが完全にクロックを固定できていません。 |
OS | Microsoft Windows 10 Home 64-bit |
CPU | Intel(R) Core(TM) i7-7700K 定格4.20GHz テスト時は3.6GHz (100MHz x 36) |
MB | ASUS PRIME Z270-K |
Memory | DDR4 16GB (8GB x 2 Dual channel) 2133MHz |
備考 | CPUは4コア、8スレッド、AVX2対応。動作クロックをRyzenと同じ全コア3.6GHzで固定し、省電力設定およびTurbo BoostはBIOSで無効化、動作クロックがテスト中に変動しないようにしています。 |
AMV4 Video Codec Ver4.02 |
CodecBench64.exe Ver1.01 自作のベンチマークソフト(非公開) |
■結果
Codec | Mode | Module | Encode FPS | Decode FPS |
AMV4 | DY3 | AVX2.0 | 643 | 704 |
AMV4 | DY3 | SSE4.1 | 643 | 880 |
Codec | Mode | Module | Encode FPS | Decode FPS |
AMV4 | DY3 | AVX2.0 | 1106 | 1169 |
AMV4 | DY3 | SSE4.1 | 747 | 646 |
■考察
AVX2を使ったKabylakeが突出した性能を発揮していることが解ります。ちなみにこのFPSが540を超えると 理論上4K動画を秒間60フレーム以上処理する能力があります。
一方、RyzenはAVX2とSSE4どちらでもエンコード処理はほぼ同じ性能となっています。AVX2命令を使っても性能が向上しないためこのテストではKabylakeと比べると少し見劣りする結果となりました。
PC Watchのこちらの記事によると
Ryzenの場合256bitのAVX命令は128bitのマイクロオペレーションコード2つに分解して処理するためAVX命令、SSE命令どちらを使っても単位時間あたりに処理できるデータ数(Byte数)に違いが出ないようです。
また、Ryzenのデコード処理に注目するとAVX2版よりSSE4版の方が2割以上良い結果が出ています。
さらに言えば、KabylakeのSSE4版よりもRyzenの方がいい結果となっています。
これは単にAVX命令とSSE命令による違いではなく、プログラムの実装方法による違いが影響していると思われます。
まだ調べていないので予想となりますが、AMV4ビデオコーデックは条件分岐処理を排除することで処理速度の向上を図っているけど、SSE4版のデコード処理だけは条件分岐処理を使って処理するようになっているので、そのことがRyzenでは良い結果につながっているのかもしれません。
・RyzenはAVX命令を使ってもSSE命令を使ってもパフォーマンスは変わらない(プログラムによっては、AVXを使うとパフォーマンスが低下する場合がある)
・Ryzenは分岐処理を使っても高いパフォーマンスを維持できるかもしれない(未検証)
・KabylakeのAVX命令は額面通りの圧倒的な性能を発揮する(ただしAVX命令を活かせるプログラムは皆無に近い)
・AVX命令を活かせないプログラムの場合にどちらが有利かはプログラム次第、IPCは互角と言って良いのではないでしょうか。ただし、空冷で簡単に5GHzを達成するので動作クロックを考慮するとやはり1コアあたりの性能はKabylakeに軍配が上がることが多いと思います。
最後に、RyzenでAMV4ビデオコーデックを使う場合はSSE4を使うように設定した方が良いです(自動設定だとAVX2を使ってしまいます)。AMV4ビデオコーデック以外でもAVX命令を使うかどうか設定できるプログラムの場合にAVXを使わないように設定することで性能が向上する場合があるようなので、Ryzenにおける豆知識かもしれません。
