Coelacanth's Dream

GCC、LLVM に Rocket Lake のオプションが追加

日本では 2021/03/30 に発売が開始された Rocket Lake(-S) だが、それから約 2週間経ってオープンソースで開発される C言語コンパイラ GCC とコンパイラバックエンドである LLVM に Intelのソフトウェアエンジニアより、Rocket Lake への最適化オプションを追加するパッチが投稿された。

Rocket Lake が対応する x86命令範囲について、GCC へのパッチでは、Ice Lake (client) をベースに SGX (Software Guard Extensions) を引いたものだと説明されている。
SGX については ark.intel.com によると、モバイル向け Tiger Lake (Family: 0x6, Model: 0x8c) でもサポートされていない。1

CLWB命令には対応せず

LLVM には同時に Ice Lake (client)CLWB 命令をサポートしないとして、それをコンパイラ側にも反映させるパッチが投稿されている。

CLWB は Cache Line Write Back の略であり、任意のキャッシュラインをメモリへ即時に書き戻す (Write Back) 機能が持たされている。これにより、あるコアが読み込みアクセスを行う際、そのアドレスへの変更した (Modified) 状態のキャッシュラインを持ったコアに対して通知を送り、そのコアがキャッシュラインの状態変更や通知への応答を返して、それからメモリに書き戻す、という手間を減らすことができる。
キャッシュラインをそのまま保持することも可能であり、キャッシュミスが発生する可能性を減らす最適化にも用いられる。
また、CLWB 命令は不揮発性メモリにおけるデータの永続化のためにも使われる。

不揮発性メモリ (Intel Optane Persistent Memory) をサポートする関係か、Intel CPU では Skylake (server) から CLWB 命令はサポートされている。
ただし Cannon Lake ではサポートせず、Ice Lake (client) がコンシューマ向けとしては初めてサポートするとされ、Intel® 64 and IA-32 Architectures Optimization Reference Manual (May 2020) でも Ice Lake (client) での新機能として紹介されているが、
実際にはサポートしていないらしく、それを反映させたのがリンク先のパッチとなる。機能的に持たないのか、それとも無効化されているのかは不明。

Ice Lake (client)CLWB 命令の非サポートについては、GCC には 2020/06 2、Intel が公開している x86命令のエンコーダー/デコーダー intelxed/xed には 2020/11 にそのことを反映させるパッチが投稿されており3、LLVM だけ何故か遅れている状況にあった。
Tremont (Atom系アーキテクチャ) と Tiger Lake では正式に CLWB 命令をサポートしている。Ice Lake という括りでも、サーバー向けである Ice Lake (server) では当然サポートされている。
ただ不思議なことに Ice Lake (client) と同じマイクロアーキテクチャのコア (Sunny Cove) と Tremont を搭載するハイブリッドプロセッサ Lakefield でもサポートされているようだ。 (Source: InstLatx64) 4

参考リンク


  1. Intel® Core™ i7-1185G7 Processor (12M Cache, up to 4.80 GHz, with IPU) Product Specifications ↩︎

  2. [PATCH] x96: Remove PTA_CLWB from PTA_ICELAKE_CLIENT ↩︎

  3. ICL: update CLWB availability · intelxed/xed@b47f2b4 ↩︎

  4. InstLatx64/GenuineIntel00806A1_Lakefield_LC_InstLatX64.txt at e833cd79ce0aab79df0d2879b14e01d4edd359b7 · InstLatx64/InstLatx64 ↩︎