ROCmプラットフォームにおけるテスト、ベンチマーク、認定を行うツールのコレクション ROCm Validation Suite (RVS) に、MCM (Multi-Chip Module) 構成を採る GPU かどうかを判定するコードが追加された。
MCM構成を採る AMD GPU として、ここでは Aldebaran/MI200 が対象となっている。また、Aldebaran/MI200 は GPUダイ 2基で構成され、プライマリーダイとセカンダリーダイとで役割が分かれている。ダイ自体は同一ではないかと思われる。
MCM における電力管理機能では、関連したパッチが以前 Linux Kernel の AMD GPUドライバーに投稿されていた。
プライマリーダイとセカンダリーダイで構成される Aldebaran/MI200 GPU | Coelacanth’s Dream
そのパッチは、電力情報の取得が可能なのがプライマリーダイのみであるため、取得と電力制限の設定をプライマリーダイのみに行うようにするという内容だった。
今回でその電力情報がどうなっているかが補足される形となり、ROCmValidationSuite に追加されたログに出力する部分の内容にて、プライマリーダイが自身とセカンダリーダイを合わせたソケットレベルでの電力情報を報告することが明かされた。
/* AMD MCM GPU/s was found in the system */ if (true == amd_mcm_gpu_found) { msg_stream.str(""); msg_stream << "Note: The system has Multi-Chip Module (MCM) GPU/s." << "\n" << "In MCM GPU, primary GPU die shows total socket (primary + secondary) power information." << "\n" << "Secondary GPU die does not have any power information associated with it independently."<< "\n"; rvs::lp::Log(msg_stream.str(), rvs::logresults); }
Kernel Mode Driver (KMD) である AMD GPUドライバーでプライマリーダイのみから電力情報を読み取るようにしていることから、ハードウェア側でソフトウェアからは 1つの GPU に見えるよう、より密に統合する処理を実装している可能性が考えられる。
電力制限もプライマリーダイのみに設定されるため、ダイ間でそれぞれの温度や電力情報を低レイテンシでやり取りしていると思われる。
ついでに追加されたコードの意味について解説を試みると、まず以下は Aldebaran/MI200 の DeviceID (PCI ID) であり、同 ID は既に AMD GPUドライバーに記述されている。1
DeviceID: 0x7410
は GPU の仮想機能を使用しているときの ID。
定数 MAX_NUM_MCM_GPU
は、配列の要素数や forループの判定部分で使われており、単に対象とする MCM GPU の DeviceID 数を示している。
/* No of GPU devices with MCM GPU */ #define MAX_NUM_MCM_GPU 4 /* Unique Device Ids of MCM GPUS */ static const uint16_t mcm_gpu_device_id[MAX_NUM_MCM_GPU] = { /* Aldebaran */ 0x7408, 0x740C, 0x740F, 0x7410};
上記 DeviceID は gpu_check_if_mcm_die
関数で使われている。
gpu_check_if_mcm_die
関数は引数に取った DeviceID と比較して、mcm_gpu_device_id[4(MAX_NUM_MCM_GPU)]
に格納されたものと 1つでも一致するものがあれば true
を返し、それが MCM GPU だと伝えるというシンプルな処理。
/** * @brief Check if the GPU is die (chiplet) in Multi-Core Module (MCM) GPU. * @param device_id GPU Device ID * @return true if GPU is die in MCM GPU, false if GPU is single die GPU. **/ bool gpu_check_if_mcm_die (uint16_t device_id) { uint16_t i = 0; bool mcm_die = false; for (i = 0; i < MAX_NUM_MCM_GPU; i++) { if(mcm_gpu_device_id[i] == device_id) { mcm_die = true; break; } } return mcm_die; }
gpu_check_if_mcm_die
関数の概要部で MCM を Multi-Core Module の略としているが、他では Multi-Chip Module としているため、これは単なるタイポだろう。