标签: cpuid

如何检测Intel Alder Lake CPU中的P/E-Core?

哪个逻辑处理器属于 P 核心组,哪个属于 E 核心组?

我的第一个想法是检查每个逻辑处理器的基本时钟,然后假设最低的基本时钟属于 E 核(根据英特尔规范,E 核的基本时钟总是明显低于 P 核)。

我希望HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor在注册表中进行检查就足够了。不幸的~MHz是始终包含 P 核的基本时钟。

x86 intel cpu-cores cpuid

7
推荐指数
1
解决办法
4100
查看次数

使用CPUID检测CPU规格,可靠的解决方案?

我正在尝试收集有关我的CPU的信息__cpuid().虽然它在我的计算机上运行正常,但当我在我的同事的计算机上运行我的程序时,它检测到英特尔酷睿2四核Q6600是超线程的,但根据英特尔自己网站上的规格,它不是.

__cpuid()还可以检测错误数量的"逻辑核心",如下所示:以 编程方式检测物理处理器/核心的数量,或者在Windows,Mac和Linux上是否激活超线程.声称英特尔至强E5520拥有16个逻辑核心和8个物理核心.

我尝试在我自己的计算机上运行该线程中的代码,Intel i7 2600K给我的数字与Xeon相同.

__cpuid()真的可靠吗?根据我自己的经验,它似乎并不那么可靠.我有一些非常根本的错误吗?

cpu cpuid

6
推荐指数
1
解决办法
1830
查看次数

i5-2500k上的cpuid指令:未设置MMX,SSE,SSE2位

这是预期的吗?我希望我的Sandy Bridge CPU报告它可以处理MMX,SSE和SSE2指令.这些位是否未设置,因为这些"旧"指令集已被某些较新的指令集"取代"?

在这里使用此代码将CPU检测放入我的代码中.

#include "CPUID.h"
int main(int argc, char *argv[]) {
    CPUID cpuid;
    cpuid.load(0);
    printf("CPU: %.4s%.4s%.4s", 
        (const char*)&cpuid.EBX(),
        (const char*)&cpuid.EDX(),
        (const char*)&cpuid.ECX()
    );
    char brand[0x30];
    cpuid.load(0x80000002); memcpy(brand,&cpuid.EAX(),16);
    cpuid.load(0x80000003); memcpy(brand+16,&cpuid.EAX(),16);
    cpuid.load(0x80000004); memcpy(brand+32,&cpuid.EAX(),16);
    printf("%.48s\n",brand);
    cpuid.load(1);
    // tests bit 23 of ECX for popcnt instruction support
    printf("MMX - %s\n", cpuid.EAX() & (1 << 23) ? "yes" : "no");
    printf("SSE - %s\n", cpuid.EAX() & (1 << 25) ? "yes" : "no"); 
    printf("SSE2 - %s\n", cpuid.EAX() & (1 << 26) …
Run Code Online (Sandbox Code Playgroud)

c++ cpu intel instruction-set cpuid

6
推荐指数
1
解决办法
1527
查看次数

如何使用x86中的CPUID指令接收L1,L2和L3高速缓存大小

我在准备汇编程序x86项目时遇到了一个问题,该程序的主题是编写一个获取L1数据,L1代码,L2和L3缓存大小的程序.

我试图在英特尔文档和互联网上找到一些东西,但我失败了.

主要问题是:对于AMD处理器,只需将EAX寄存器设置为80000005h和80000006h值,并从ECX和EDX寄存器获取所需数据,但在Intel情况下,我只能获取L2的此信息.

我该怎么做才能获得英特尔处理器的L1和L3缓存大小?

x86 caching cpuid

6
推荐指数
1
解决办法
3909
查看次数

__asm__ 在 C++ 错误

我正在尝试使用以下 cod 读取 cpuid 信息,但它不起作用。我正在使用 Visual Studio 2010:

#include "stdafx.h"
#include <stdio.h>

int main()
{
  int a, b;

  for (a = 0; a < 5; a++)
  {
    __asm__("cpuid"
            :"=a"(b)                 // EAX into b (output)
            :"0"(a)                  // a into EAX (input)
            :"%ebx","%ecx","%edx");  // clobbered registers

    printf("The code %i gives %i\n", a, b);
  }

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

这就是它所说的:

'project_scs.exe': Loaded 'C:\Users\rares992\Documents\Visual Studio 2010\Projects\project_scs\Debug\project_scs.exe', Symbols loaded.
'project_scs.exe': Loaded 'C:\Windows\SysWOW64\ntdll.dll', Symbols loaded (source information stripped).
'project_scs.exe': Loaded 'C:\Windows\SysWOW64\kernel32.dll', Symbols loaded (source information stripped).
'project_scs.exe': …
Run Code Online (Sandbox Code Playgroud)

c++ assembly visual-studio-2010 cpuid

6
推荐指数
1
解决办法
6210
查看次数

如何找到当前硬件线程的L3缓存索引和NUMA节点索引

我正在用 C 为任何 Intel 或 AMD 系统构建套接字、NUMA 节点、缓存、内核和线程的拓扑树。

构建这个层次结构,我想确保硬件线程被适当地组合在一起,以便清楚谁精确地共享什么。我发现我可以设置线程的关联性,然后使用该cpuid指令获取我想要的很多信息,但不是全部。

如果包/套接字有多个 NUMA 节点,如何获取当前硬件线程的 NUMA 节点索引?如果NUMA节点有多个L3缓存,如何获取索引?

AMD在 NUMA 节点 ID 中有一些东西Fn8000_001E_ECX,但我找不到任何可与Intel相媲美的东西。没有任何关系:L3 索引。

c c++ x86 numa cpuid

6
推荐指数
1
解决办法
60
查看次数

在 x64 上获取不带 __asm 的 SSE 版本

我正在尝试构建 VS2010 CRT 库的某些函数的稍微修改的版本,除了尝试访问可能保存指令集架构版本(ISA)的全局变量的部分外,一切都很好:

if (__isa_available > __ISA_AVAILABLE_SSE2)
{
    // ...
}
else if (__isa_available == __ISA_AVAILABLE_SSE2)
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

我在程序集文件中找到了它应该保存的值

__ISA_AVAILABLE_X86   equ 0
__ISA_AVAILABLE_SSE2  equ 1
__ISA_AVAILABLE_SSE42 equ 2
__ISA_AVAILABLE_AVX   equ 3
Run Code Online (Sandbox Code Playgroud)

无法找到如何以及在何处__isa_available分配值(我已尝试在所有目录中查找文件......)

MSDN参考CPUID示例来确定指令集。问题是它使用了__asm块,而这些块在我的 x64 版本中是不允许的。

有谁知道如何快速分配正确的值__isa_available

c++ assembly sse visual-c++ cpuid

5
推荐指数
1
解决办法
1911
查看次数

为什么 CPUID + RDTSC 不可靠?

我正在尝试在 x86-64 处理器上分析执行时间的代码。我指的是这篇英特尔白皮书,并且还浏览了其他 SO 线程,讨论了在此处此处使用 RDTSCP 与 CPUID+RDTSC 的主题。

在上面提到的白皮书中,使用 CPUID+RDTSC 的方法被称为不可靠,并且也使用统计数据进行了证明。

CPUID+RDTSC 不可靠的原因可能是什么?

此外,同一白皮书中的图 1(最小值行为图)和图 2(方差行为图)中的图具有“方波”模式。什么解释了这种模式?

x86 intel microbenchmark rdtsc cpuid

5
推荐指数
1
解决办法
531
查看次数

QEMU/KVM 缺少 CPU 功能标志(kvm 没有通过?)

我正在尝试使用 kvm 在 qemu 中进行一些操作系统开发。我使用的是 x86-64,我的主机 CPU 是 Intel i7-6700K (Skylake)。问题是当我使用-cpu host.

我特别在寻找“est”(增强型 SpeedStep)。如果我lscpu在主机中运行,它会显示许多 cpu 标志,包括 est。如果查看我的操作系统中的 cpuid 结果,我会看到大约一半丢失了,包括 est)。

我想我明白 kvm 不会自动通过所有 cpu 标志,但是我怎么能告诉它通过特定标志(或者可能只是所有标志)?

x86-64 kvm qemu osdev cpuid

5
推荐指数
1
解决办法
346
查看次数

缓存集大小不是 2 的幂

我有一台配备 Ryzen 7 1800X CPU 的 Linux 计算机。根据 WikiChip 的说法,它的 L2-DTLB 有 1536 个条目。所以我假设关联性可以被 3 整除。我编写了一个小程序来检查 CPUID 报告的关联性。有趣的是,它给了我 8 的关联性。为什么呢?这将给出 192 个条目的集合大小,因此没有简单的模 2 次幂索引。那么该指数是如何有效计算的呢?

那是我的程序:

#include <iostream>
#if defined(_MSC_VER)
    #include <intrin.h>
#elif defined(__GNUC__)
    #include <cpuid.h>
#endif

using namespace std;

unsigned cpuid( unsigned (&cpuidRegs)[4], unsigned code, unsigned ex );

int main()
{
    static unsigned const SHORT_WAYS[0x10] = { 0, 1, 2, 0, 4, 0, 8, 0, 16, 0, 32, 48, 64, 96, 128, (unsigned)-1 };
    unsigned regs[4];
    cpuid( regs, 0x80000006u, 0 …
Run Code Online (Sandbox Code Playgroud)

x86 cpu-architecture tlb cpuid amd-processor

5
推荐指数
1
解决办法
526
查看次数