キャッシュプロファイル
キャッシュ、つまりキャッシュ。キャッシュは、読み取りパフォーマンスを向上させることができ、原理的には、全体的な確率を高めるために、アクセス速度を高周波アクセスの部分を記憶した記憶媒体のより優れた性能を持つコンテンツです。
開発では、私たちの口のキャッシュは、変数、またはRedisのことができます。コンピュータのCPUの内部では、CPUは、多くの場合、CPUのキャッシュのすべてのレベルを指します。
CPUキャッシュの原則
見つからない、比較的低速なメモリからの読み出しの速度とCPUに送信され、キャッシュは、最初のCPUキャッシュから、すぐに読み込まれ、CPUに送られた、CPUがデータを読み出すためにするときに動作していますデータがキャッシュに転送されたデータブロックは、全体的に後で発生することがありながら、データ処理、メモリを呼び出すことなく、キャッシュから読み出します。このメカニズムは、CPUのみ10について、CPUのキャッシュの読み取りデータの次の90%であること、CPUが読み取りキャッシュヒット率が非常に高い(ほとんどのCPUを最大90%)で読み込むことができています%がメモリから読み出される必要があります。これは、CPUが直接CPUを待たずに、データベースを読み込み時のメモリを読んで保存します。一般的には、CPUは、まずキャッシュメモリ後のデータ列を読み込みます。(ウィキペディアより抜粋)
モデルの簡素化以降では、アクセスCPUのメモリ内容にしたい場合:
CPUコア1 - > L1キャッシュ - > L2キャッシュ - > L3キャッシュ - > RAM
CPUコア2 - > L1キャッシュ - > L2キャッシュ - > L3キャッシュ - > RAM
それは単純な場合、各CPUコアは、独自の独立したマルチレベルのキャッシュを持っていることに留意すべきである、3つの一般的ながあります。アクセス速度、L1> L2> L3、容量は、一般に速度に反比例します。あなたがどこかの変数宣言int型のfoo = 1;、CPUのfooにはマルチレベルキャッシュメモリのヒットを取るために行く前に、存在しない場合のL1〜L3キャッシュから値を得ることであること。人気のポイント
今は比較的新しいIntelのCPUモデル、キャッシュはL2キャッシュ、すなわち「スマートキャッシュ」共有キャッシュ技術を共有する各他の設計された、デュアルコアのもはや独立していません。
キャッシュライン
長さカットオープンでのキャッシュは、キャッシュラインがたくさんあります。キャッシュキャッシュラインは、最小単位で、通常は64バイトです。L1キャッシュが6400バイトであれば、彼は100キャッシュラインに分けることができます。C言語では、最小のメモリユニットは、などの変数、int型、長い長い、彼らは通常は4バイトまたは8バイトでなければなりません感じることができます。パフォーマンスのためのCPUのキャッシュ、および大規模な息キャッシュメモリの単位で、通常はキャッシュラインです。キャッシュキャッシュラインは、変数の数の値になります。キャッシュライン場合はダーティなデータを持っているだけでなく、ユニット全体のためにそれを更新します。
キャッシュの一貫性
コンピュータは、キャッシュ内のデータが常に新しいものであることを確認する必要があります。メモリの値が変更された場合は、CPUのキャッシュは時間的に同期されていない、一貫性のないデータがありました。マルチコアCPUアーキテクチャの下では、そのような複数のCPUのキャッシュとして、一貫性がより複雑であることを確認するために、変数の値をキャッシュしますが、その変数は、コアの1どのように他のタイムリーな知覚とリフレッシュCPUコアにキャッシュの値を変更されていますキャッシュ?
MESIプロトコルは、マルチコアCPUキャッシュ・コヒーレンスを解決することができます。
MESI(修正独占共有、または無効) 摘自https://www.cnblogs.com/shangxiaofei/p/5688296.html
MESIは、 契約はサポートが広くイリノイ州立大学で使用される、キャッシュコヒーレンシプロトコルのライトバックポリシーは、プロトコルは、IntelのPentiumシリーズのCPUで使用されている提案ためにも、イリノイ州の契約として知られています。
MESIプロトコル状態
各CPUのキャッシュライン(caceh線)は、4つの状態(二つの追加(ビット)に示す)を用いて標識されました:
M:修飾されている(変形)
キャッシュ・ラインがメイン・メモリ内のデータと矛盾すること、のみCPUのキャッシュにキャッシュされ、そして(汚れた)変更され、メモリ内のキャッシュ・ラインは、時間的に将来の時点を必要(CPUは、他の可能対応するメモリ)、ライトバック(書き戻し)、メインメモリの前にメインメモリをお読みください。
メインメモリにライトバックされた後、キャッシュラインの状態は排他的(排他的)状態になります。
E:排他(排他)
キャッシュラインのみが変更されないCPU、(クリーン)のキャッシュにキャッシュされ、メインメモリと一貫性のあるデータ。いつでも他のCPU(共有)を読み取るために共有メモリがなったとき、この状態は状態であってもよいです。
同様に、変更状態のキャッシュラインの内容を変更するCPUは、状態になることができます。
S:共有(共有)
キャッシュ・ラインを変更するCPUがある場合、キャッシュラインは、CPUのキャッシュの複数、各キャッシュ内のデータの整合性とメインメモリのデータ(クリーン)であってもよいことは、この状態の手段、
キャッシュラインの他のCPUは、((無効)非アクティブになる)をキャンセルすることができます。
I:無効(無効)
キャッシュは、(他のCPUがキャッシュラインを変更する必要がある場合があります)は無効です。
簡単な要約:
有効期限が切れたキャッシュラインに他のコアに通知するために使用される様々なコアCPUモード間の通信は、あります。CPU キャッシュの書き込み操作の前に、キャッシュがどの状態ラインを決定します。
場合は、共有状態のキャッシュ、コアCPUの書き込み操作は、他のCPUコアを通知するために放送されます。
このように、キャッシュの一貫性を確保。
キャッシュミス
私たちは、データ読み出し速度を向上させるためにCPUのキャッシュを知っておく必要があります。あなたは、メモリ、CPUにアクセスしたい場合は、キャッシュは、我々はキャッシュミス彼に電話しませんでした。キャッシュミスがあなたの頭の大きなを行います、CPUがキャッシュにロードされたメモリデータに多くの時間を費やす必要がありました。一般的に、ミス率L1は約10%です。逆さまにし、それについて考え、現場から約90%が実際に存在し、プログラマ偉大な神の能力を賞賛する必要があります。
偽共有偽共有
すなわち、不健康な偽共有MESI 共有 / 無効の 状態。このシナリオを考えてみましょう。
1 2 3 4 |
|
同時に、唯一の彼自身、その変数を読み書きするには、2つのスレッド(スレッド1とスレッド2)があります。一見、すべての2つの変数が実際に非常に近い取得するため、互いに独立してそれぞれを果たしキャッシュラインに配置される傾向にあります。スレッド1、読み取りと書き込みthread1_dataはthread2_dataキャッシュのCore2のコアがそのようにキャッシュを更新するよう、無効無効としてマークされる原因となります。私たちは、それがメモリキャッシュにロードされたトリガがあまりにも頻繁にパフォーマンスの低下の原因となります場合は、非常に時間のかかるものであることがわかっています。
読み取りと書き込みのアレイ上の偽共有の問題に特に注意して、マルチスレッド。
偽共有の性質は一見変数間の高い言語の概念は、独立しているが、CPUのキャッシュのレベルで、二つの変数のアドレスは(キャッシュラインの範囲内で)近いあまりにも苦しむことにあることができ、全体としてのみキャッシュラインビューのポイント。
バリアバリアでのご注文のうちCPU命令
キャッシュミスやその他の時間のかかる作業が、何か他のものをやって、同時にデータをロードすることができますCPUのので、そのディレクティブは確かに中断されます。
つまり、CPUの命令は、高速性能と高効率化のために順序を外れて実行されます。
オーダーのOUT命令は、一般的な例を与え、私たちの周りに起こりました
1 2 |
|
注文のうちCPU命令の場合には、Bは知られていない誰に割り当てられています。複数のスレッドがケースをロック解除そのため、に依存している場合、それは非常に深刻な問題を引き起こします。
バリアコマンドは、順不同でCPU命令の問題を解決することができます。これは、注文のうちいくつかの場所ではないでCPUに指示します。これは、高度な言語のユーザのための低レベルの命令であり、ロックは解決するために、アトミック操作を使用すべきです。