Coelacanth's Dream

AMD CPU も Intel Thread Director と同様の機能を実装か

AMD の Perry Yuan 氏により、Linux Kernel に AMD Hetero Core Hardware Feedback Driver (amd_hfi) を追加するパッチが公開されている。

パッチ内では、AMD におけるヘテロジニアスアーキテクチャの目標はバックグラウンドスレッドを Dense (高密度, “c” 系) コアに割り当て、優先度の高いスレッドを Classic (高性能, 無印系) コアに割り当てることで消費電力の観点でメリットを得ることだと説明されている。
バックグラウンドスレッドを Dense コアに割り当てれば、処理に必要な電力は少なくて済み、その分を Classic コアにまわすことで優先度の高いスレッドをより速く処理することができる。
また Dense コアを増やすことでマルチスレッド性能も向上させられる。

Hardware Feedback Interface (HFI) は実行中のスレッドの分類機能もあり、分類とその Class ID、割り当てられるのが望ましいコアの種類、優先度の例が以下のテーブル。

    +Thread Classification Example Table
    +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    ++----------+----------------+-------------------------------+---------------------+---------+
    +| class ID | Classification | Preferred scheduling behavior | Preemption priority | Counter |
    ++----------+----------------+-------------------------------+---------------------+---------+
    +| 0        | Default        | Performant                    | Highest             |         |
    ++----------+----------------+-------------------------------+---------------------+---------+
    +| 1        | Non-scalable   | Efficient                     | Lowest              | PMCx1A1 |
    ++----------+----------------+-------------------------------+---------------------+---------+
    +| 2        | I/O bound      | Efficient                     | Lowest              | PMCx044 |
    ++----------+----------------+-------------------------------+---------------------+---------+
    +

BIOS/UEFI から提供され、共有メモリに配置される CPU コアのランキングデータも amd_hfi ドライバーはスケジューリングに活用する。
ソースコードからドライバーの動作を完全に読み取れてはいないが、自分の理解で書くと、ランキングデータにはすべての CPU コア (スレッド) 分の性能と電力効率の能力を示す値が含まれているのだろう。 ドライバーは CPU コア (スレッド) から実行中のスレッドの分類を読み取り、そしてそのコア (スレッド) が処理に対して最適でない場合、ランキングデータから最適なコア (スレッド) を選択する。

機能としては概ね Intel HFI, Intel Thread Director (ITD), EHFI (Enhanced HFI) と同じと見ていいだろう。
ただしスレッドの分類は異なり、ITD の場合は以下のようになっている1

Intel Thread Director Description
Class 0 Non-vectorized integer or floating-point code.
Class 1 Integer or floating-point vectorized code,
excluding Intel® Deep Learning Boost (Intel® DL Boost) code.
Class 2 Intel DL Boost code.
Class 3 Pause (spin-wait) dominated code.

AMD のヘテロジニアスアーキテクチャは Intel のそれとは異なり、マイクロアーキテクチャと IPC は同一であるため、CPPC (Collaborative Processor Performance Control) に関連する値の設定を調整することで充分適したスケジューリングができると自分は考えていたが、実際は性能と電力効率の最大化にはハードウェアからヒントを用いたスケジューリングが必要だったのだろう。

CPUID

AMD HFI, Workload Classification の機能フラグビットは CPUID 0x8000_0021:EAX:Bit22 とされている。

    +	{ X86_FEATURE_WORKLOAD_CLASS,   CPUID_EAX,  22, 0x80000021, 0 },

AMD HFI に関する情報は CPUID 0x8000_0027 から読み取ることができる。なお CPUID 0x8000_0027 はまだ AMD が公開しているドキュメントには記載されていない。
CPUID 0x8000_0027:EAX がサポートしているスレッドのクラス (分類) 数を示す。

    +	nr_class_id = cpuid_eax(AMD_HETERO_CPUID_27);
    +	if (nr_class_id < 0 || nr_class_id > 255) {
    +		dev_warn(dev, "failed to get supported class number from CPUID %d\n",
    +				AMD_HETERO_CPUID_27);
    +		return -EINVAL;
    +	}

また、CPUID 0x8000_0027:EBX がランキングテーブルの更新モードに関するフラグ等を示すと思われる。

    +	amd_hfi_data->hfi_meta->dynamic_rank_feature =
    +					cpuid_ebx(AMD_HETERO_CPUID_27) & 0xF;

InstaLatx64 氏の Github リポジトリで公開されている Ryzen 7 9700X の CPUID 実行結果一覧を見ると2CPUID 0x8000_0021:EAX:Bit22 フラグビットが立っており、また CPUID 0x8000_0027:EAX が 3 となっているため、AMD HFI は Zen 5/c からサポートしていると考えられる。

Ryzen AI 300 Series は Zen 5Zen 5c のヘテロジニアスアーキテクチャを採っており、amd_hfi ドライバーによる最適化が期待される。
西川善司氏による 4Gamer.net の記事にて、Windows では I/O 処理スレッド等は Zen 5c に積極的に割り当てるようになっていることが書かれており、Windows では既に先行して amd_hfi ドライバーと同様の機能が実装されていると考えられる。3