哪个逻辑处理器属于 P 核心组,哪个属于 E 核心组?
我的第一个想法是检查每个逻辑处理器的基本时钟,然后假设最低的基本时钟属于 E 核(根据英特尔规范,E 核的基本时钟总是明显低于 P 核)。
我希望HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor
在注册表中进行检查就足够了。不幸的~MHz
是始终包含 P 核的基本时钟。
我正在尝试收集有关我的CPU的信息__cpuid()
.虽然它在我的计算机上运行正常,但当我在我的同事的计算机上运行我的程序时,它检测到英特尔酷睿2四核Q6600是超线程的,但根据英特尔自己网站上的规格,它不是.
__cpuid()
还可以检测错误数量的"逻辑核心",如下所示:以
编程方式检测物理处理器/核心的数量,或者在Windows,Mac和Linux上是否激活超线程.声称英特尔至强E5520拥有16个逻辑核心和8个物理核心.
我尝试在我自己的计算机上运行该线程中的代码,Intel i7 2600K给我的数字与Xeon相同.
那__cpuid()
真的可靠吗?根据我自己的经验,它似乎并不那么可靠.我有一些非常根本的错误吗?
这是预期的吗?我希望我的Sandy Bridge CPU报告它可以处理MMX,SSE和SSE2指令.这些位是否未设置,因为这些"旧"指令集已被某些较新的指令集"取代"?
#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) 我在准备汇编程序x86项目时遇到了一个问题,该程序的主题是编写一个获取L1数据,L1代码,L2和L3缓存大小的程序.
我试图在英特尔文档和互联网上找到一些东西,但我失败了.
主要问题是:对于AMD处理器,只需将EAX寄存器设置为80000005h和80000006h值,并从ECX和EDX寄存器获取所需数据,但在Intel情况下,我只能获取L2的此信息.
我该怎么做才能获得英特尔处理器的L1和L3缓存大小?
我正在尝试使用以下 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) 我正在尝试构建 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
?
我正在尝试使用 kvm 在 qemu 中进行一些操作系统开发。我使用的是 x86-64,我的主机 CPU 是 Intel i7-6700K (Skylake)。问题是当我使用-cpu host
.
我特别在寻找“est”(增强型 SpeedStep)。如果我lscpu
在主机中运行,它会显示许多 cpu 标志,包括 est。如果查看我的操作系统中的 cpuid 结果,我会看到大约一半丢失了,包括 est)。
我想我明白 kvm 不会自动通过所有 cpu 标志,但是我怎么能告诉它通过特定标志(或者可能只是所有标志)?
我有一台配备 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)