但是我们知道Intel构架的CPU是用微码实现的,也就是一条汇编指令(机器码)是由多条微码构成的。而执行微码也是需要时钟进行控制的。假设某INTEL CPU是10级流水,并假设每阶段都设计的很好,执行需要的时间都一样,而每个阶段有10条微指令构成,所以一条指令完整执行完需要100个微码周期(我说的微码周期是执行一条微码需要的时间),假定流水充分到极致,那么平均每条指令需要10个微码周期。
那么我的问题就在于,主板送给CPU的1G频率是直接驱动微码的执行,还是在CPU中倍频10倍?达到10G的频率去驱动微码?
如果是前者,CPU上一秒钟执行的汇编指令(机器码)是100M条,而后者的话,一秒钟要执行1G条汇编指令(机器码)。
到底是那种情况呢?请懂的大侠回答一下吧。
3 个解决方案
#1
1GHz
#2
也就是说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;
}
如果你要试试看实际情况,可以使用读取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
也就是说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;
}
如果你要试试看实际情况,可以使用读取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;
}