0

x86/i64 のドキュメントを調べたところ、(%rip) が命令キャッシュを使用していると言及している場所が見つかりませんでした。したがって、これが事実であると 100% 確信しているわけではありません。

私は正しいかどうか疑問に思っています。もしそうなら、RIP を使って 4KB のバッファにアクセスしたいと思います。なぜなら、それにアクセスするコードは非常に小さいからです (まあ、余分な 4000 バイトを収容するのに十分小さいからです)。g++ でそれを行う方法は知っていますが、 clでそれを行う方法を見たことがありません。それは私が本当に学びたいと思うもう一つのことです!

g++ を使用すると、次のように記述できます。

__asm__ __volatile__ (".align 4                       \n\r"
                      ".big_num:                      \n\r"
                      ".long 0x01020304               \n\r"
                      ".long 0x05060708               \n\r"
                      ".long 0x01020304               \n\r"
                      ".long 0x05060708               \n\r"
                      "movdqa .big_num(%rip), xmm0    \n\r");

マイクロソフトのプログラムでこれに相当するものは何ですか?

__asm {
  mov big_number(%rip), xmm7
  jmp loop
big_number:
  ???
loop:
}

----- 更新 (2013 年 1 月 24 日)

実際には、RIP アドレッシング モードはオフセットのみに制限されています。

mov offset(%rip), reg

次のようなインデックスが必要になるため、それは役に立ちません。

mov offset(%rip, %eax, 4), reg

とにかく不可能です。

4

1 に答える 1

3

Intelのマニュアルに記載されている内容を理解しているので、命令キャッシュは、命令自体(より遠いキャッシュ(L2およびL3)から、最終的にはメインメモリからフェッチされる場合)および命令内でエンコードされたデータに使用されます。

キャッシュラインの粒度は32/64バイトであるため、命令キャッシュはコードに埋め込まれたデータの一部を吸い込む可能性があります。ただし、mov命令がアクセスしているデータは、データキャッシュから別のルートを経由するため、これは役に立たない可能性があります。

総括する:

  • L1キャッシュには、L1命令キャッシュとL1データキャッシュの2つの独立した部分が含まれています。
  • L2キャッシュは、コードとデータの両方の統合キャッシュです。
  • L3もL2として統合されています。

L1ICとL1DCの両方がL2の同じ場所からものをプルする場合、L2のいくつかのテーブルの寿命をいくらか長くすることができるかもしれませんが、それだけです。実際にデータをL1命令キャッシュに移動することはできません。

于 2013-01-22T10:09:20.827 に答える