我一直在試圖用一個簡單的分析器來測量學校服務器上一些C代碼的效率,而且我遇到了一個奇怪的情況。經過短時間(半秒鐘)後,處理器突然開始執行兩倍的指令。我已經測試了幾乎所有我能想到的原因(緩存,內核負載平衡,因休眠而改變CPU頻率),但一切似乎都正常。爲什麼我的CPU突然以兩倍的速度工作?
爲什麼它值得我在學校的linux服務器上做這個測試,所以可能有一個我不知道的不尋常的配置,但是使用的處理器ID不會改變,並且(通過top )服務器在我測試時完全空閒。
測試代碼:
#include <time.h>
#include <stdio.h>
#define MY_CLOCK CLOCK_MONOTONIC_RAW
// no difference if set to CLOCK_THREAD_CPUTIME_ID
typedef struct {
unsigned int tsc;
unsigned int proc;
} ans_t;
static ans_t rdtscp(void){
ans_t ans;
__asm__ __volatile__ ("rdtscp" : "=a"(ans.tsc), "=c"(ans.proc) : : "edx");
return ans;
}
static void nop(void){
__asm__ __volatile__ ("");
}
void test(){
for(int i=0; i<100000000; i++) nop();
}
int main(){
int c=10;
while(c-->0){
struct timespec tstart,tend;
ans_t start = rdtscp();
clock_gettime(MY_CLOCK,&tstart);
test();
ans_t end = rdtscp();
clock_gettime(MY_CLOCK,&tend);
unsigned int tdiff = (tend.tv_sec-tstart.tv_sec)*1000000000+tend.tv_nsec-tstart.tv_nsec;
unsigned int cdiff = end.tsc-start.tsc;
printf("%u cycles and %u ns (%lf GHz) start proc %u end proc %u\n",cdiff,tdiff,(double)cdiff/tdiff,start.proc,end.proc);
}
}
輸出我看到:
351038093 cycles and 125680883 ns (2.793091 GHz) start proc 14 end proc 14
350911246 cycles and 125639359 ns (2.793004 GHz) start proc 14 end proc 14
350959546 cycles and 125656776 ns (2.793001 GHz) start proc 14 end proc 14
351533280 cycles and 125862608 ns (2.792992 GHz) start proc 14 end proc 14
350903833 cycles and 125636787 ns (2.793002 GHz) start proc 14 end proc 14
350924336 cycles and 125644157 ns (2.793002 GHz) start proc 14 end proc 14
349827908 cycles and 125251782 ns (2.792997 GHz) start proc 14 end proc 14
175289886 cycles and 62760404 ns (2.793001 GHz) start proc 14 end proc 14
175283424 cycles and 62758093 ns (2.793001 GHz) start proc 14 end proc 14
175267026 cycles and 62752232 ns (2.793001 GHz) start proc 14 end proc 14
我得到類似的輸出(它採取了不同數量的測試效率提高一倍)使用不同的優化級別(-O0到-O3)。
它可能與超線程有關,其中物理內核中的兩個邏輯內核(服務器使用至強X5560可能會產生這種影響)可以以某種方式「合併」以形成一個兩倍速的處理器?
這難道不是CPU限制的常見現象嗎? – xbug 2014-11-21 21:47:53
我認爲它起初是CPU節流,但我從週期/時間計算GHz,它在2.793處非常一致(這是/ proc/cpuinfo報告的速度)。如果CPU被限制,那麼這個值是不是會減半? – dooglius 2014-11-21 21:51:20
您應該閱讀關於'Turbo Boost'的信息,我很確定該CPU可用。 – Petesh 2014-11-21 21:57:20