未来のいつか/hyoshiokの日記

hyoshiokの日々思うことをあれやこれや

Intelのマニュアルの読み方

Intelのマニュアルの話は幾度となくしたが*1、先日ハードコピーを1セット発注して*2、最近ではIA-32 Intel Architecture Optimization Reference Manual 016版 *3を愛読書としている。昔持っていた版は004版(ぼろぼろだ*4)なので最新版(016版)ではいろいろ記述が追加されている。cache周りのことも随分記述が充実している。004版の厚みは18mmで016版は28mmだ。
付録BのIntel Pentium 4 Processor Performance Metrix、Microarchitecture Notesが必読だ。Bus and Memory Metricsを読む。図B-1 Relationships Between the Cache Hierarchy, IOQ, BSQ and Front Side BusにキャッシュとIOQ、BSQ、システムバスの関連図がある。この図と、Volume 3の10章の図10-1とは微妙に違うような気がするがここでは気にしないことにする。IOQってのはいったい何の略かというのはマニュアルに書いてないみたいだが勝手にI/O Queueだと想像する。FSBはFront Side BusでBSQはBus Sequence Queueだ。この図から、キャッシュへのアクセスはBSQが制御しているように想像できる。L2/L3のキャッシュミスによってシステムメモリへのアクセスが発生する場合、BSQからFSB_IOQを経由してシステムバスへ信号が行く。
システムメモリへのreadは2種類ある。通常のメモリへのreadとメモリへwriteするためにRFO(Reads for Ownership)する時のreadがある。RFOというのは次のような動作である。メモリへwriteするときキャッシュミスをしたら

  • 置き換えるキャッシュラインを選ぶ
  • そのキャッシュラインが変更されていればメモリに書き出す
  • 変更されていなければ何もしない
  • writeミスしたメモリのキャッシュライン分メモリから読み出す(Reads for Ownership)

この最後の動作がRFOである。キャッシュラインは64バイトなので、仮に4バイトのアクセスだとしても残りの60バイトも一緒にごそっとreadして64バイト分のキャッシュラインを作成する。書き出しの単位も64バイトなので、隣の4バイトを書き出すときはwriteヒットしてキャッシュを書き換えるだけで処理が進む。

置き換えるべきキャッシュラインが変更されているとwritebackが発生しそれをdirty evictions(犠牲)という。

writeミスの時もRFOのためにreadが発生するというのがここでのポイントである。Software Developer's Manual Volume 3の表A-1にパフォーマンスモニタリングイベントが記されている。BSQ_CACHE_REFERENCEイベントについても記されているが、read 2nd/3rd level cache miss/hitのイベントは定義されているがwrite miss/hitのイベントは記されていない。

Optimization Reference Manual, pp. B-13

Current implementations of the BSQ_cache_reference event do not distinguish between programmatic read and write misses. Programmatic writes that miss must get the rest of the cache line and merge the new data. Such a request is called a read for ownership (RFO). To the “BSQ_cache_reference” hardware, both a programmatic read and an RFO look like a data bus read, and are counted as such. Further distinction between programmatic reads and RFOs may be provided in future implementations.

BSQ_cache_referenceイベントの現実装は、readとwriteミスを区別していない。ミスをするプログラム上のwriteはキャッシュラインの残りを確保し新しいデータをマージしなければならない。そのようなリクエストをRFO (Read for Ownership)と呼ぶ。BSQ_cache_referenceハードウェアにとって、プログラム上のreadとRFOはデータバスへのreadと似ていて、そのように計測する。プログラム上のreadとRFOのさらなる区別は今後の実装によって提供されるかもしれない。

ということなので、ハードウェアイベント上区別するのは難しそうである。

Intelのマニュアルの読み方の話をしていたら、結局マニュアルを読むことになってしまった。ついでに昔の未踏ソフトウェア創造事業でマニュアルを読んでいたことを思い出し、(id:hyoshiok:20040311) http://itpro.nikkeibp.co.jp/members/NSW/ITARTICLE/20030619/1/ http://itpro.nikkeibp.co.jp/members/NSW/ITARTICLE/20030619/2/ http://itpro.nikkeibp.co.jp/members/NSW/ITARTICLE/20030709/1/ http://itpro.nikkeibp.co.jp/members/NSW/ITARTICLE/20030709/2/ 読みふける。

 そこでわたしは,あらためてメモリー・プロファインリグ・ツールに課題がいろいろあることを認識した。一番の課題は,キャッシュ・ミスの問題を発見した後の解決策の提示だ。PostgreSQLの場合は,たまたま解決方法を思い付けたが,誰もがそうできるとは限らない。火事を発見できても,火消しの方法がわからないのでは,簡単に利用できない。

cache pollutionの問題を発見したら、キャッシュをバイパスする命令を利用するという解決策は提示した。

 また,メモリー・プロファイリング・ツールを利用して,劇的に性能向上させた実例もほしくなった。「このツールのおかげで性能が☆倍に向上しました!」という威勢のいい例である。キラー・アプリケーションのようなものだ。

cache pollution aware patchで劇的とは言わないまでも性能向上に寄与はした。(10%前後だけど)まあ、亀の歩みだが昨日よりは進歩はしているなぁと思った。

*1:id:hyoshiok:20040726とかid:hyoshiok:20040801

*2:http://developer.intel.com/design/pentium4/manuals/index2.htmからオーダーできる。(無料だ!)ハードコピーは016版だが、CD-ROM版は017版で微妙に新しい。

*3:http://developer.intel.com/design/pentium4/manuals/248966.htmからPDFをダウンロードすることもできる。

*4:http://itpro.nikkeibp.co.jp/members/NSW/ITARTICLE/20030619/2/ph3.htmlこの写真はIA-32 Intel Architecture Software Developer's Manual, Volume 3だ。