问一个关于CPU运行频率的问题,主频1G的CPU,内部是工作在1G还是更高?

时间:2022-07-30 18:10:48
对于PC系统,主板上提供外频,经过主板上的倍频电路,可以产生CPU使用的主频。假设外频是100M,倍频是10,那么CPU主频就是1G了。

但是我们知道Intel构架的CPU是用微码实现的,也就是一条汇编指令(机器码)是由多条微码构成的。而执行微码也是需要时钟进行控制的。假设某INTEL CPU是10级流水,并假设每阶段都设计的很好,执行需要的时间都一样,而每个阶段有10条微指令构成,所以一条指令完整执行完需要100个微码周期(我说的微码周期是执行一条微码需要的时间),假定流水充分到极致,那么平均每条指令需要10个微码周期。

那么我的问题就在于,主板送给CPU的1G频率是直接驱动微码的执行,还是在CPU中倍频10倍?达到10G的频率去驱动微码?
如果是前者,CPU上一秒钟执行的汇编指令(机器码)是100M条,而后者的话,一秒钟要执行1G条汇编指令(机器码)。

到底是那种情况呢?请懂的大侠回答一下吧。

3 个解决方案

#1


1GHz

#2


引用 1 楼 net_friends 的回复:
1GHz


也就是说INTEL的1G主频的CPU执行一条指令要花费十几个纳秒,是吗?

#3


1G.你的计算方法没错,但是那是平均情况.如果加入多核那就更复杂了.
如果你要试试看实际情况,可以使用读取CPU时钟周期tick.然后看两条指令之间过去多少tick.范例如下.
uint64_t procTicks()
{
ticks_type time;
uint low_half;
uint high_half;
__asm{
push eax;
push edx;
rdtsc;
mov low_half,eax;
mov high_half,edx;
pop edx;
pop eax;
//: "=g"(time.halves.low_half), "=g"(time.halves.high_half)
//:
//: "%eax", "%edx"
}
time.halves.low_half = low_half;
time.halves.high_half = high_half;


return time.value;
}

#1


1GHz

#2


引用 1 楼 net_friends 的回复:
1GHz


也就是说INTEL的1G主频的CPU执行一条指令要花费十几个纳秒,是吗?

#3


1G.你的计算方法没错,但是那是平均情况.如果加入多核那就更复杂了.
如果你要试试看实际情况,可以使用读取CPU时钟周期tick.然后看两条指令之间过去多少tick.范例如下.
uint64_t procTicks()
{
ticks_type time;
uint low_half;
uint high_half;
__asm{
push eax;
push edx;
rdtsc;
mov low_half,eax;
mov high_half,edx;
pop edx;
pop eax;
//: "=g"(time.halves.low_half), "=g"(time.halves.high_half)
//:
//: "%eax", "%edx"
}
time.halves.low_half = low_half;
time.halves.high_half = high_half;


return time.value;
}