何をもってメモリアクセスのマージが起きたと言えるか?
を投稿したところ、以下のコメントをいただきました。
これについてのアンサーを考えていたら、長文になったのでここで供養します。
(夜中に書いてしまったので、後で修正するかもです)
以下、Xで回答しようとした拙文
痛いところつかれている部分と一部語弊がありそうなので、詳しく説明させてください。
また、長文になることをお許しください。
まず語弊についてです。
x86-64での実行時間と比べM1Maxのそれが18倍速いという結果からメモリアクセスの省略が起こっていると結論付けられています
正確に言えば、x86-64の実行時間から明らかに速くなっていることはあくまで調査のきっかけに過ぎません。なのでXCHG命令とMOV命令が命令レベルで速いかどうかは問題ではありません。
調査を進めると、命令がない場合(BenchmarkEmpty)とほぼ性能差がないことから、メモリアクセスをするはずの命令が無視できるレベルの速さで実行されることを確認しました。
次に、メモリアクセスの省略が起き得ないStoreLoadの平均実行速度が、StoreとLoadの速度の和より大きくなっていることを確認しました。
最終的に、命令に対する実行時間の線形性が成り立たないことから、メモリアクセスのマージが起こっていると結論づけています。
痛いところつかれていると思うのは、あくまでこれらは憶測にすぎないということです。
fujitaさんのおっしゃるように、バスをみないとメモリアクセスという電気的信号が省略されているかは確定しません。
しかも、今回の例だとおそらくL1キャッシュに乗るでしょうから、実際にメモリアクセスが実行されたとしてもバスを使ってDRAMと通信する確証もありません。
(マルチコアで動かす想定でも、ARMの場合ハードウェアのメモリモデルが弱めなのでプロセッサ側で通信したりします)
参照: https://research.swtch.com/hwmm
追記: M1MacはUnified Memory Architecture(UMA)という構造上、PCIバスを使いませんし、DRAMへのアクセスを計測することは難しそうです
強調しておきたいのが、そもそもメモリアクセスとはなんでしょうか?
L1キャッシュへの書き込みでしょうか、それともPCIバスを使ってメモリモジュールと通信することでしょうか?
これが定義できないなら、マージの電気信号的挙動も定義できません
また定義したとしても、プロセッサは与えられたメモリモデルを保証すれば十分機能しますから、プロセッサによってこれらの挙動も異なるでしょう
例えるなら、これらはプログラミング言語とセマンティックスの関係に似ています。
変数への書き込みは、ある言語では対応するレジスタへの書き込みかもしれないし、もしかしたらメモリへの書き込みを必要とするかもしれません。
しかし、そんなことはプログラミング言語が言語仕様を守った挙動していれば、どちらでもいいのです。
そこで僕が考えるのは、メモリアクセスやマージは電気信号的挙動で定義できるものではないということです。これらはハードウェアが守る仕様(約束事)でしかありません。
より一般的に表現すれば以下です。
メモリアクセスは、ある書き込みが、とある一貫性モデルをもって、次回の読み込みに観測可能性を与えることと考えます。
マージは、ある複数の書き込みが与えた or ある複数の読み込みが受けた観測可能性が同一になってしまうことと考えます。
ハードウェアのメモリモデルがこの挙動を許す時、メモリアクセスに対応する命令は命令レベル並列化(ILP)のような挙動、言い換えると、命令に対する実行時間の線形性が成り立たない挙動が許されます。
(それこそがARMのハードウェアメモリモデルのパフォーマンス上の目的です。なので設計時は逆の発想だと思います; ILPを実現したいから緩いハードウェアメモリモデルを定義した)
この観点に立つと、メモリアクセスの実行時間の非線形性から、マージが起こっていると呼んで良いと考えています。
少し強引な定義で気持ち悪いですが、それ以外に説明できる方法が見つかりませんでした。
これらの議論は記事にまとまりをもたせるために意図的に触れなかったことをお許しください。
免責事項:
CPUアーキテクチャに精通しているわけではないので、もしかしたら他の要因があるかもしれません。
と記事に記述するように、あくまで自分はソフトウェアエンジニアであり、CPUの専門家ではありません。
パタヘネを流し読みしたぐらいの低レイヤに興味がある素人です。
また、上記の解釈は完全にドキュメント化されているわけではありません。
もし誤りがあったら、ご指摘と、可能であれば勉強になる参考をいただけると嬉しいです。
正直、十分性を欠いていることに否定できないです。
- メモリアクセスのマージ→ILP→速くなる
が言えるからといって
- 速くなる→ILP→メモリアクセスのマージ
とは言えないはず。
ただ今回の場合、それ以外に説明できないのである程度確からしい、という話でいいんじゃないかなあ