7

L1 データ、L1 コード、L2 および L3 キャッシュ サイズを取得するプログラムを作成することを目的としたアセンブラー x86 プロジェクトの準備中に問題が発生しました。

インテルのドキュメントとインターネットで何かを見つけようとしましたが、失敗しました。

主な問題は次のとおりです。AMD プロセッサの場合、EAX レジスタを 80000005h および 80000006h の値に設定し、ECX および EDX レジスタから目的のデータを取得するだけですが、Intel の場合、L2 に対してのみこの情報を取得できます。

Intel プロセッサの L1 & L3 キャッシュ サイズを取得するにはどうすればよいですか?

4

3 に答える 3

4

Marat Dukhan は基本的に正しい答えを出しました。新しい Intel プロセッサ、つまり過去 5 ~ 6 年間に製造されたプロセッサの場合、最善の解決策は cpuid リーフ 4 を列挙することです。つまり、最初に EAX=4 と ECX=0 で、次に EAX= で cpuid を数回呼び出します。 4 および ECX=1 など。これにより、キャッシュのサイズとタイプに関する情報が返されるだけでなく、これらのキャッシュが CPU コアとハイパースレッディング/SMT ユニットにどのように接続されているかもわかります。アルゴリズムとサンプル コードは、https://software.intel.com/en-us/articles/intel-64-architecture-processor-topology-enumeration/で、より具体的には「キャッシュ トポロジの列挙」というタイトルのセクションで提供されています。

于 2014-07-11T14:37:27.320 に答える
1

CPUID 命令を使用して、CPU の L1、L2、および L3 キャッシュ サイズを取得できます。Intel x86 Software Developer's Manual Volume 2 (Instruction Set Reference) によると。CPU キャッシュ情報は、EAX が 2 または 4 の CPUID 命令によって取得できます。EAX=2 は古いバージョンであり、新しい CPU では使用されないようです。そこでEAX=4の場合で紹介します。

その出力形式は次のとおりです。

CPUID4_1

CPUID4_2

したがって、次の式でキャッシュ サイズを計算できます。

キャッシュ サイズ = (Ways + 1) * (Partitions + 1) * (Line_Size + 1) * (Sets + 1) または

キャッシュサイズ = (EBX[31:22] + 1) * (EBX[21:12] + 1) * (EBX[11:0] + 1) * (ECX + 1)

たとえば、ubuntu システムで「cpuid -li」命令を実行すると、次の出力が得られます。

   deterministic cache parameters (4):
  --- cache 0 ---
  cache type                           = data cache (1)
  cache level                          = 0x1 (1)
  self-initializing cache level        = true
  fully associative cache              = false
  extra threads sharing this cache     = 0x1 (1)
  extra processor cores on this die    = 0x7 (7)
  system coherency line size           = 0x3f (63)
  physical line partitions             = 0x0 (0)
  ways of associativity                = 0x7 (7)
  ways of associativity                = 0x0 (0)
  WBINVD/INVD behavior on lower caches = false
  inclusive to lower caches            = false
  complex cache indexing               = false
  number of sets - 1 (s)               = 63
  --- cache 1 ---
  cache type                           = instruction cache (2)
  cache level                          = 0x1 (1)
  self-initializing cache level        = true
  fully associative cache              = false
  extra threads sharing this cache     = 0x1 (1)
  extra processor cores on this die    = 0x7 (7)
  system coherency line size           = 0x3f (63)
  physical line partitions             = 0x0 (0)
  ways of associativity                = 0x7 (7)
  ways of associativity                = 0x0 (0)
  WBINVD/INVD behavior on lower caches = false
  inclusive to lower caches            = false
  complex cache indexing               = false
  number of sets - 1 (s)               = 63
  --- cache 2 ---
  cache type                           = unified cache (3)
  cache level                          = 0x2 (2)
  self-initializing cache level        = true
  fully associative cache              = false
  extra threads sharing this cache     = 0x1 (1)
  **extra processor cores on this die    = 0x7 (7)
  system coherency line size           = 0x3f (63)
  physical line partitions             = 0x0 (0)**
  ways of associativity                = 0x3 (3)
  ways of associativity                = 0x0 (0)
  WBINVD/INVD behavior on lower caches = false
  inclusive to lower caches            = false
  complex cache indexing               = false
  number of sets - 1 (s)               = 1023
  --- cache 3 ---
  cache type                           = unified cache (3)
  cache level                          = 0x3 (3)
  self-initializing cache level        = true
  fully associative cache              = false
  extra threads sharing this cache     = 0xf (15)
  extra processor cores on this die    = 0x7 (7)
  system coherency line size           = 0x3f (63)
  physical line partitions             = 0x0 (0)
  ways of associativity                = 0xb (11)
  ways of associativity                = 0x6 (6)
  WBINVD/INVD behavior on lower caches = false
  inclusive to lower caches            = true
  complex cache indexing               = true
  number of sets - 1 (s)               = 12287

L1 データキャッシュのサイズ: (7+1) (0+1) (63+1)*(63+1)=32K

L3 キャッシュのサイズ: (11+1) (0+1) (63+1)*(12287+1)=9M

于 2020-10-30T11:40:32.653 に答える