52

アルゴリズムのプロファイリングと最適化を試みていますが、さまざまなプロセッサに対するキャッシュの具体的な影響を理解したいと考えています。最近の Intel x86 プロセッサ (Q9300 など) では、キャッシュ構造に関する詳細情報を見つけるのは非常に困難です。特に、プロセッサの仕様を掲載しているほとんどの Web サイト ( Intel.comを含む) には、L1 キャッシュへの言及が含まれていません。これは、L1 キャッシュが存在しないためですか、それとも何らかの理由でこの情報が重要ではないと見なされているためですか? L1 キャッシュの廃止に関する記事や議論はありますか?

[編集] さまざまなテストと診断プログラム (主に以下の回答で説明されているもの) を実行した後、私の Q9300 には 32K L1 データ キャッシュがあるように見えるという結論に達しました。この情報を入手するのが非常に難しい理由について、私はまだ明確な説明を見つけていません。私の現在の作業理論では、L1 キャッシングの詳細は現在 Intel によって企業秘密として扱われています。

4

7 に答える 7

67

Intel キャッシュの仕様を見つけることはほぼ不可能です。昨年、キャッシュに関するクラスを教えていたとき、Intel 内 (コンパイラ グループ) の友人に尋ねましたが、彼らは仕様を見つけることができませんでした。

ちょっと待って!!! Jedさん、彼の魂に祝福を

grep . /sys/devices/system/cpu/cpu0/cache/index*/*

これにより、連想性、セットサイズ、およびその他の多くの情報が得られます (ただし、待ち時間は含まれません)。たとえば、AMD は 128K の L1 キャッシュを宣伝していますが、私の AMD マシンにはそれぞれ 64K の I キャッシュと D キャッシュが分割されていることを知りました。


Jed のおかげで、ほとんどが廃止された 2 つの提案:

  • AMD はそのキャッシュに関するより多くの情報を公開しているため、少なくとも最新のキャッシュに関する情報を得ることができます。たとえば、昨年の AMD L1 キャッシュは、サイクル (ピーク) ごとに 2 ワードを配信しました。

  • このオープンソース ツールvalgrindにはあらゆる種類のキャッシュ モデルが含まれており、キャッシュの動作をプロファイリングして理解するのに非常に役立ちます。kcachegrindKDE SDK の一部である非常に優れた視覚化ツールが付属しています。


例: 2008 年第 3 四半期、AMD K8 / K10 CPU は 64 バイトのキャッシュ ラインを使用し、各 L1I/L1D 分割キャッシュは 64kB です。L1D は 3 サイクルのレイテンシで、L2 との双方向連想および排他的です。L2 キャッシュは 16 ウェイ連想で、レイテンシは約 12 サイクルです。

AMD Bulldozer ファミリーの CPUは、クラスターごとに 16kiB の 4 ウェイ連想 L1D (コアごとに 2 つ) を持つ分割 L1 を使用します。

Intel CPU は長い間 L1 を同じに保ってきました (Pentium M からHaswell、Skylake まで、そしておそらくその後何世代にもわたって): I および D キャッシュごとに 32kB を分割し、L1D は 8 ウェイ アソシアティブです。DDR DRAM のバースト転送サイズと一致する 64 バイトのキャッシュ ライン。ロード使用レイテンシは最大 4 サイクルです。

タグ wikiも参照してください。

于 2009-04-04T01:05:07.260 に答える
8

さらに調べてみました。ETH Zurich には、L1 および L2 キャッシュの少なくともサイズ (および場合によっては結合性) に関する情報を取得できる可能性があるメモリ パフォーマンス評価ツールを作成したグループがあります。このプログラムは、さまざまな読み取りパターンを実験的に試し、結果のスループットを測定することによって機能します。Bryant と O'Hallaron による人気のある教科書には簡略化されたバージョンが使用されました。

于 2009-04-04T19:03:28.650 に答える
8

開発者の仕様ではなく、消費者の仕様を見ています。 ご希望の資料はこちらです。キャッシュ サイズはプロセッサ ファミリのサブモデルによって異なるため、通常 IA-32 開発マニュアルには記載されていませんが、NewEgg などで簡単に調べることができます。

編集:より具体的には: ボリューム 3A (システム プログラミング ガイド) の第 10 章 (システム プログラミング ガイド)、最適化リファレンス マニュアルの第 7 章、および潜在的に TLB ページ キャッシング マニュアルの何か。約。

于 2009-04-04T01:06:21.860 に答える
2

これらのプラットフォームには L1 キャッシュが存在します。これは、メモリとフロント サイド バスの速度が CPU の速度を超えるまで、ほぼ間違いなく当てはまります。

Windows では、GetLogicalProcessorInformationを使用して、ある程度のキャッシュ情報 (サイズ、ライン サイズ、連想性など) を取得できます。Win7 の Ex バージョンでは、どのコアがどのキャッシュを共有しているかなど、さらに多くのデータが得られます。 CpuZもこの情報を提供します。

于 2009-04-04T00:11:34.160 に答える
2

参照の局所性は、一部のアルゴリズムのパフォーマンスに大きな影響を与えます。L1、L2 (および新しい CPU では L3) キャッシュのサイズと速度は、明らかにこれに大きな役割を果たします。行列乗算は、そのようなアルゴリズムの 1 つです。

于 2009-04-04T00:59:37.850 に答える
1

インテル マニュアル Vol. 2 は、キャッシュ サイズを計算する次の式を指定します。

このキャッシュ サイズ (バイト単位)

= (ウェイ + 1) * (パーティション + 1) * (Line_Size + 1) * (セット + 1)

= (EBX[31:22] + 1) * (EBX[21:12] + 1) * (EBX[11:0] + 1) * (ECX + 1)

、、およびはWays、set toを使用して照会されます。PartitionsLine_SizeSetscpuideax0x04

ヘッダー ファイル宣言の提供

x86_cache_size.h:

unsigned int get_cache_line_size(unsigned int cache_level);

実装は次のようになります。

;1st argument - the cache level
get_cache_line_size:
    push rbx
    ;set line number argument to be used with CPUID instruction
    mov ecx, edi 
    ;set cpuid initial value
    mov eax, 0x04
    cpuid

    ;cache line size
    mov eax, ebx
    and eax, 0x7ff
    inc eax

    ;partitions
    shr ebx, 12
    mov edx, ebx
    and edx, 0x1ff
    inc edx
    mul edx

    ;ways of associativity
    shr ebx, 10
    mov edx, ebx
    and edx, 0x1ff
    inc edx
    mul edx

    ;number of sets
    inc ecx
    mul ecx

    pop rbx

    ret

私のマシンでは次のように動作します:

#include "x86_cache_size.h"

int main(void){
    unsigned int L1_cache_size = get_cache_line_size(1);
    unsigned int L2_cache_size = get_cache_line_size(2);
    unsigned int L3_cache_size = get_cache_line_size(3);
    //L1 size = 32768, L2 size = 262144, L3 size = 8388608
    printf("L1 size = %u, L2 size = %u, L3 size = %u\n", L1_cache_size, L2_cache_size, L3_cache_size);
}
于 2019-08-17T12:53:19.727 に答える