インテル® マイクロアーキテクチャー
開発コード名 Alder Lake 向け
OpenMP* アプリケーションの最適化考察
202２ 年 1 月
IA Software User Society (iSUS)
編集長 すがわら きよふみ

内容
◼

評価環境
◼
◼

◼
◼
◼
◼

◼

インテル® Core™ i7-11700K プロセッサー (Rocket Lake-S✝) ベース
インテル® Core™ i7-12700K プロセッサー (Alder Lake-S✝) ベース

インテル® スレッド・ディレクターとプログラムのアフィニティー制御
OpenMP* のアフィニティー制御
マルチスレッド・アプリケーションの比較と評価
命令セットの評価
まとめ✝開発コード名| 2

はじめに◼ これまで C/C++ および Fortran で使用されてきた柔軟性と移植性が高い OpenMP* を使用したマルチスレッド・プログラミングに関する知識が、新しいプラットフォームでどのように活用できるか調査します◼ ここで紹介するパフォーマンスに関連するデータは、iSUS が独自に収集したものであり、インテル社の公式な見解ではありません| 3利用する CPU とシステム (1)Windows* 11 Pro 21H2 (22000.438)| 4利用する CPU とシステム (2)E コアか?

Windows* 11 Pro 21H2 (22000.438)| 5

Gen11 と Gen12 の比較• インテル® Core™ i7-11700K プロセッサーの従来のコアとインテル® Core™ i7-12700K
プロセッサーの P コアの構成はほぼ同じ• L2 キャッシュと L3 キャッシュの構成が異なる| 6

CPU の詳細を確認 ...

| 7CPU の詳細を確認 ... ここでは詳しく調査しません
インテル® Core™ i7-11700K プロセッサー

インテル® Core™ i7-12700K プロセッサー| 8インテル® スレッド・ディレクターとプログラムのアフィニティー制御| 10

インテル® スレッド・ディレクター (ITD)
Windows* 11 では、インテル® スレッド・ディレクター (ITD) のハードウェア・ヒントを利用して、OS がスレッドを自動的にスケジューリングできます◼

インテル® スレッド・ディレクター (ITD) は、オペレーティング・システムに命令セット・アーキテクチャー(ISA) を認識させ、Performance-core と Efficient-core 間のパフォーマンス差 (および電力効率の変化)を認識し、タスクに最も適したコアにスレッドをスケジュールします◼

一般には、強いアフィニティーはアプリケーションと OS 間の決まりごとであるため、避けるように指示されています◼

強いアフィニティーを使用すると、プラットフォームの最適化ができなくなり、 OS はインテル® スレッド・ディレクターからのアドバイスを無視することになります。強いアフィニティーは予期しない問題を引き起こす可能性があるため、ミドルウェアが強いスレッド・アフィニティーを使用しているか確認する必要があります。これは、強いスレッド・アフィニティーがアプリケーションによるハードウェアへのアクセスに直接影響するためです◼

強いアフィニティーの問題は、低消費電力デバイスなど Performance-core よりも Efficient-core が多いシステムでは、強いアフィニティーによって OS のスケジュールが制限されるため、特に問題となります| 11関連する重要なドキュメント

https://www.isus.jp/isus-translated-documents/| 12

OpenMP* のスレッド数とアフィニティー制御◼

◼

◼

アプリケーションがプログラム内で明示的にスレッド数を指定していない場合、利用可能な最大論理スレッド数がプログラムが利用するスレッド数となります
環境変数 OMP_NUM_THREADS で動的にスレッド数を変更できます
生成されたスレッドは、環境変数 KMP_AFFINITY (インテル® コンパイ
ラー固有) と OMP_PROC_BIND を設定することでスレッドの配置(アフィニティー) を制御できます| 13

KMP_AFFINITY と OMP_PROC_BIND
KMP_AFFINITY と OMP_PROC_BIND は使い方が異なります◼
◼

KMP_AFFINITY={compact, scatter, none, verbose}
KMP_AFFINITY=granularity={fine,core}{,compact, scatter, balanced, verbose}https://www.isus.jp/products/c-compilers/thread-affinity-control/◼

OMP_PROC_BIND={primary, spread, close}• close : 共有キャッシュの利点を得るため、スレッドを同じソケット上の連続するコアに割り当てます• spread : すべてのコアに少なくとも 1 つのスレッドが割り当てられるまで、スレッドを別々のコアに配置します• primary : プライマリースレッドと同じ場所に割り当てます
https://www.isus.jp/products/c-compilers/openmp-ref-5-2-1121-released/| 14

OpenMP* アプリケーションのアフィニティー制御を行うプログラムはどのような影響を受けるのか| 15

キャッシュとスレッドのトポロジーを確認• KMP_AFFINITY に verbose オプションを指定すると、実行環境とアフィニティーに関連する情報を表示できます• OpenMP* スレッドとランタイムからはコアのタイプを識別できません| 16

どのようなケースにアフィニティーを制御するのか
1. 複数ソケットのプラットフォームで、アプリケーションを 1 つのソケットのみで実行したい、またはソケット全体で実行したい
2. ハイパースレッディングが有効なシステムで、1 物理コアに 1 論理スレッドを割り当てたい、または 1 物理コアに 2 論理スレッドを割り当てたい

デスクトップやモバイル環境でもありうるケース:• アプリケーションが使用するスレッド数を明示的に制御している (2、4、8 など)• ハイパースレッディングが有効なシステムでパフォーマンスが思ったようにスケールしない (ハイパースレッディング固有の制限の影響を受ける)
https://www.isus.jp/others/insights-to-hyper-threading/| 17

スレッド数が 1 の場合

インテル® Core™ i7-12700K プロセッサーで実行• E コアには全くスレッドが割り当てられていない| 18

スレッド数が 16 の場合

インテル® Core™ i7-12700K プロセッサーで実行• スレッドは、P コア と E コアに割り当てられている| 19

アフィニティーの影響インテル® Core™ i7-12700K プロセッサーで実行| 20

アフィニティーとパフォーマンスの傾向
インテル® Core™ i7-11700K プロセッサー

インテル® Core™ i7-12700K プロセッサー

スレッド数が論理コア数の半分であれば E コアの影響はほとんどない| 21

スレッド数とアフィニティーの影響インテル® Core™ i7-12700K プロセッサーで実行| 22

スレッド数とアフィニティーの影響インテル® Core™ i7-12700K プロセッサーで実行| 23

ここまでのまとめ◼ プロセッサーの論理コア数の半分のスレッドを生成する、メモリーやキャッシュの利用率が低い計算主体型のアプリケーションは、ハイパースレッディングが有効な
従来のプロセッサーコアでは、compact アフィニティーよりも scatter アフィニティーのほうが高いパフォーマンスを発揮する傾向がありました◼ インテル® Core™ i7-12700K プロセッサー (開発コード名 Alder Lake マイクロアーキテクチャー) では、計算集約型のスレッドが E コアに固定割り当てされると、パフォーマンスを損ねるインバランス状態となることがあります◼ インテル様がおっしゃるとおり … 余計なことはするなという結論です| 24

命令セット| 25

インテル® Core™ i7-11700K プロセッサーとインテル® Core™ i7-12700K プロセッサーを同じ条件で使用
16 スレッドのアプリケーションを Alder Lake✝ の E コアを使用せずに実行

16 スレッドのアプリケーションを Rocket Lake-S✝ で実行✝開発コード名| 26

インテル® Core™ i7-11700K プロセッサーとインテル® Core™ i7-12700K プロセッサーを同じ条件で使用
16 スレッドのアプリケーションを Alder Lake✝ の E コアを使用せずに実行

20 スレッドを起動してE コアも活用

16 スレッドのアプリケーションを Rocket Lake-S✝ で実行✝開発コード名| 27

ターゲット・アーキテクチャー向けの最適化
インテル® SSE2

インテル® AVX2

インテル® AVX2 + α

Alder Lake-S✝ でコンパイルして実行✝開発コード名| 28

/Qx (-x) alderlake オプション
Alder Lake✝ マイクロアーキテクチャー・ベースのプラットフォームでは、通常インテル® AVX-512命令セットは利用できませんが、インテル® コンパイラー・クラシックや LLVM ベースの新しいインテル® DPC++/C++ コンパイラーには alderlake ターゲットオプションが用意されています

Rocket Lake-S✝ でコンパイルして実行
icl と icx で生成されるプロセッサーの自動判定ロジックが異なる…

インテル® AVX2 ベースのバイナリーが生成されますが、下位互換性がない命令セットが含まれるので注意してください✝開発コード名| 29

シングルスレッドでの命令セットによる差インテル® Core™ i7-12700K プロセッサー
インテル® AVX2 命令セットを実行

インテル® Core™ i7-11700K プロセッサー
インテル® AVX-512 命令セットを実行| 30

インテル® VTune™ プロファイラーのサポート

インテル® VTune™ プロファイラー 2022 のマイクロアーキテ
クチャー全般解析では、P コアと E コアのパフォーマンス・メトリックを識別できます| 31

インテル® VTune™ プロファイラーのサポート

インテル® VTune™ プロファイラー 2022 のマイクロアーキテ
クチャー全般解析では、P コアと E コアのパフォーマンス・メトリックを識別できます

| 32

まとめ◼

◼

◼

Alder Lake✝ マイクロアーキテクチャー・ベースのプラットフォームで、マルチスレッド・アプリケーションのパフォーマンスの問題を解決するためアフィニティーの制御を行う場合、十分に注意して評価を行ってください
インテル非推奨の方法でインテル® AVX-512 命令セットを有効にする場合、インテル® AVX2 を使用して P コアと E コアを活用する場合と十分な比較評価を行ってください
ここで使用したサンプルは、メモリーをほとんど使用しません。メモリー集約型のアプリケーションでは、前世代のプラットフォーム間との比較で異なる傾向の結果が示される可能性があることに注意してください✝開発コード名| 33

おまけ：ランタイムのプロセッサー識別の問題
インテル® C++ コンパイラー・クラシック 2022 でコンパイルして実行

インテル® C++ コンパイラー・クラッ
シックで生成されるランタイムのプロセッサー判定には問題がある

LLVM ベースの新世代インテル® C++ コンパイラー 2022 でコンパイルして実行

| 34

参考資料
◼ 第 12 世代インテル® Core™ プロセッサー (開発コード名 Alder Lake) パフォーマンス・ハ
イブリッド・アーキテクチャー向けゲーム開発者ガイド
開発コード名 Alder Lake パフォーマンス・ハイブリッド・アーキテクチャーを活用するゲーム最適化向けのアーキテクチャーの概要とベスト・プラクティスを提供します◼ x86 ハイブリッド・アーキテクチャー向けのソフトウェア最適化ホワイトペーパー日本語版
ハイブリッド・アーキテクチャーをサポートするインテル® Core™ プロセッサー向けにソフトウェアを最適化する情報を提供します◼ OpenMP* 5.2 API シンタックス・クイック・リファレンス・カード◼ OpenMP* 5.2 仕様の概略| 35

ソフトウェア・セミナー