簡體   English   中英

在代碼中使用Turboboost測量CPU頻率

[英]Measure CPU frequency with turboboost in code

我正在以三種不同頻率在三台不同的計算機上分析一些代碼。 我需要使用頻率來測量GFLOP / s。 我有一些執行此操作的代碼,但它沒有說明Turboboost。 例如,在我的2600k CPU上,它報告為3.4 GHz,但運行CPUz時,我的CPU使用所有內核的代碼都在4.3 GHz(超頻)下運行。

#include "stdint.h"
#include "stdio.h"
#include "omp.h"
int main() {
    int64_t cycles = rdtsc(); double dtime = omp_get_wtime();
    //run some code which uses all cores for a while (few ms)   
    dtime = omp_get_wtime() - dtime;
    cycles = rdtsc() - cycles;
    double freq = (double)cycles/dtime*1E-9;
    printf("freq %.2f GHz\n", freq);
}
__int64 rdtsc() {
#ifdef _WIN32
    return __rdtsc();
#else
  uint64_t t;
  asm volatile ("rdtsc" : "=A"(t));
  return t;
#endif
}  

我知道這個問題已經被問過很多次了,但是我仍然不清楚是否可以解決。 我不在乎黑客試圖更改計時器。 此代碼僅供我自己使用。 是否可以通過代碼獲取實際頻率? 在Linux上如何完成? 我在linux上發現的每個示例都給出了基本頻率(或者也許是最大),但是沒有像CPUz這樣的負載下的工作頻率。

編輯:我找到了一個用於Linux的程序Powertop,該程序似乎顯示了實際的工作頻率。 由於源代碼可用,因此有可能找出如何在我自己的代碼中獲得實際頻率。

我終於解決了這個問題。 無需設備驅動程序或讀取特殊計數器即可測量代碼中的實際工作頻率。

基本上,您為帶有循環依賴項的操作計時一個循環,該依賴項總是需要相同的延遲。 例如

for(int i=0; i<spinCount; i++) {
    x = _mm_add_ps(x,_mm_set1_ps(1.0f));
}

您可以在綁定到每個物理核心(非邏輯)核心的線程中運行此循環。 要求系統中沒有其他線程,然后這些線程會占用大量CPU時間,因此該方法不會總是給出正確的答案,但就我而言,它工作得很好。 對於單線程系統和多插槽系統上的Nahalem,Ivy Bridge和Haswell上的一個線程和許多線程,我得到的結果與正確的turbo頻率相差不到0.5%。 我在如何通過c查找cpu頻率時描述了此細節,因此在此不再贅述。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM