cpuキャッシュは大きなメモリオブジェクトをどのように扱いますか?

Scenario:

  • Cache (L1) size (CS): 32kB
  • Line size (LS): 64B
  • Associativity (A): 8
  • Set size (SS): 512B (A * LS)
  • Sets (S): 64 (C/SS)
  • Read/written object (O) has size greater than LS

Assumptions (correct me if invalid):

  • SS * A )サイズの B で表されるサイズの仮想メモリブロックは、モジューロのようにセットにマッピングされます。つまり、 0x1000:0x1FFF 0x0:0xFFFF )は、セット0にマッピングされます(ブロックインデックス( BI BI 1)は1にマッピングされます。
  • A は、その BI を見つけてそれを割り当てられたセットに移動する必要があります(非一時的な書き込み/読み取りは使用されません)。この BI は、セット6( BI %)にマップされています。たとえば、 A = 0x4600Aは BI S )。
  • キャッシュにオブジェクト( O )を適切に(ミスアライメントなしに)配置するには、 LS の配置が必要です。

Questions:

  1. Will the O be serially aligned in the cache or it can take (for instance) free slots 0 & 4 & 5, instead of 0 & 1 & 2?
  2. What is the cost (penalty) of retrieving partitioned O from cache? Assume that the O isn't partitioned across several B.
  3. The same question as above, but in case when O is placed in two B, thus two sets are used.
  4. What will happen if the O size is larger than the SS (512B)? Will it move the data to L2 and step-by-step move data to L1? Will it use other sets?
  5. What if L2 (and L3 for that matter) is too small for all the data?
3
C ++ 11にはどのように関連していますか?
追加された 著者 Bartek Banachewicz,
うーん。早すぎる最適化のような多くののように聞こえます。
追加された 著者 Bartek Banachewicz,
@BartekBanachewicz主に alignas()のために、整列操作への簡単で標準化されたアクセスを提供します。キャッシュのパフォーマンスを最適化するためにデータの整列を開始するときは、大きなオブジェクトをキャッシュするコストを求めるのは当然だと思います。
追加された 著者 Red XIII,
@ BartekBanachewicz下位レベルの最適化は時期尚早と見なされますか?私は指していないと言っている:見てみましょう、これは間違いなく私のコードのパフォーマンスのボトルネックです!私の以前の経験に基づいて、適切なキャッシュの使用は巨大なパフォーマンスの向上をもたらします。したがって、この質問が一般的なプログラムの最適化の点では無関係な理由を理解できません。
追加された 著者 Red XIII,

1 答え

Bで示されるサイズ4kB(SS * A)の仮想メモリブロックがマップされます   モジュロのようなやり方でセットに言い換えれば、アドレス0x0:0xFFFF   (ブロックインデックス(BI)0)は、セット0にマッピングされ、0x1000:0x1FFF(BI1)は   1にマップされます。

Transfer between L1 cache and the memory hierarchy: the transfer unit between the L1 cache and the following level of the memory hierarchy is a block of line size (LS) bytes. That is, to your L1 cache, memory is structured in 64 bytes blocks (LS bytes).

Correspondence between memory blocks and cache entries: consecutive memory blocks are mapped to cache lines of consecutive sets. Hence, block 0 (addresses 0x0000 : 0x003F) is mapped to a cache line at set 0, block 1 (addresses 0x0040 : 0x007F) is mapped to a cache line at set 1, and so forth.


読み書きの要求(非一時的な書き込み/読み込みは使用されません)   与えられたアドレスAはBIを見つけてそれを   割り当てられたセット。たとえば、A = 0x4600AはBI = 70となります。このBIは   セット6(BI%S)にマッピングされます。

ブロック識別子(またはインデックス)とセットインデックス(SI)を見つける正しい手順は次のとおりです。

 BI = A >> LS = 0x4600A >> 6 = 0x1180
 SI = BI & (S-1) = 0x1180 & 0x3F = 0x0000
 (when S is a power of two, BI & (S-1) = BI  mod S)

適切に(ミスアライメントなしに)r/wでオブジェクト(O)を   キャッシュの場合、LSの配置が必要です。

それは必要ではありません。 Oはブロック・アライメントする必要はありません。


Q1. Will the O be serially aligned in the cache or it can take (for instance) free slots 0 & 4 & 5, instead of 0 & 1 & 2?

O blocks will be stored in consecutive sets with cache line granularity (set k, k+1, …, S-1, 0, 1, …) .

Q2。キャッシュからパーティションOを取得するコスト(ペナルティ)はいくらですか?   OがいくつかのBに分割されていないと仮定してください。   Q3。上記と同じ質問ですが、Oが2つのBに置かれている場合、   したがって、2つのセットが使用されます。

私はあなたがキャッシュから O ワードを読むCPUのコストに興味があると思います。 O がシーケンシャルに参照されると、キャッシュアクセスの数は参照されるワードの数に等しくなります。私は、コストは、同じセット内または異なるセット内(少なくともマルチポートキャッシュ内)にあるブロックに依存しないと思います。

Q4。 OサイズがSS(512B)よりも大きい場合はどうなりますか?意志   データをL2に移動し、段階的にデータをL1に移動しますか?使用するか   他のセット?

     

Q5。 L2(とL3)がすべてのデータに対して小さすぎる場合はどうでしょうか?

空きキャッシュラインのないセットにブロックを割り当てる必要がある場合は、ブロックを選択して追い出す必要があります(ビクティムブロック)。置換ポリシーは、 アルゴリズム (LRU、 pLRU、ランダム)。

1
追加された
私はこの話題が私の奥行きから離れているので、いずれにしても投票することはできませんが、このようなQ&Aがもっとあると思います。当面はVerbal +1。
追加された 著者 deceze,