2012-03-30 5 views
16

私はちょうど素晴らしいMBA 13 "Core i7を購入しました。私は、CPU速度が自動的に変化し、かなり激しく変化していると言います。任意のココアまたはCは、実際にそれに影響を与えずに、現在のクロック速度を見つけるためにそこに呼び出して現在のCPUクロック速度をプログラム上でOS Xで検出しますか?

編集:?私は、プログラムだけでなく、端末の呼び出しを使用しての答えとOKだ

おかげ

+0

特にosxに詳しいことはありませんが、その情報を持つ/ procタイプのファイルシステムはありませんか?例えばLinuxの場合は/ proc/cpuinfo –

+0

私が知る限り、 '/ proc /'はありません。ボックスに記載されているCPU速度を与える 'system_profiler'コマンドがありますが、ライブ更新クロック速度では変更されません – Tim

+0

[この質問を見る](http://stackoverflow.com/questions/8351944/finding-outプロセッサあたりのコアあたりのCPUクロック周波数)が非常に難しい理由について説明します。 – Mysticial

答えて

5

以来。!それはIntelのプロセッサーです。あなたはいつもRDTSCを使用することができます。これは、curreを返すアセンブラー命令ですntサイクルカウンタ - 各サイクルをインクリメントする64ビットカウンタ。それは少し近似しますが、たとえば

#include <stdio.h> 
#include <stdint.h> 
#include <unistd.h> 

uint64_t rdtsc(void) 
{ 
    uint32_t ret0[2]; 
    __asm__ __volatile__("rdtsc" : "=a"(ret0[0]), "=d"(ret0[1])); 
    return ((uint64_t)ret0[1] << 32) | ret0[0]; 
} 

int main(int argc, const char * argv[]) 
{ 
    uint64_t startCount = rdtsc(); 
    sleep(1); 
    uint64_t endCount = rdtsc(); 

    printf("Clocks per second: %llu", endCount - startCount); 

    return 0; 
} 

出力 '秒あたりの時計:2002120630' 私の2GHzのMacBook Proに。

+0

私のMBAでは、それは正確に正しいですが1.8GHzを示しますが、i7をターボブーストに強制する方法はありますか? – Tim

+6

'rdtsc'はプロセッサのクロック速度を測定する信頼できる方法ではありません。ターボブースト/ CPUスロットリング(他のものの中でも)には適応しません。 – Mysticial

+0

@それと反対の神秘的な; CPUのクロック速度を正確に測定することが信頼できない方法であると通常は勧められています。なぜなら、ターボブーストとCPUスロットルの影響を受けるからです。 – Tommy

11

あなたはsysctlを経由して簡単にCPUの速度を照会し、いずれかのコマンドラインですることができます

sysctl hw.cpufrequency 

またはC経由:

#include <stdio.h> 
#include <sys/types.h> 
#include <sys/sysctl.h> 

int main() { 
     int mib[2]; 
     unsigned int freq; 
     size_t len; 

     mib[0] = CTL_HW; 
     mib[1] = HW_CPU_FREQ; 
     len = sizeof(freq); 
     sysctl(mib, 2, &freq, &len, NULL, 0); 

     printf("%u\n", freq); 

     return 0; 
} 
+0

残念ながら、これは "ボックス広告"の速度(私のMBPRでは2.3ghz)を返しますが、SpeedStepの調整速度は返していないようです。 – Tim

+0

しかし、これはsysctlの使用についての有用で簡単な洞察であるので、ありがとう! – Tim

+0

現在は通知されていませんが、通知された速度です。 hw.cpufrequency、hw.cpufrequency_min、hw.cpufrequency_maxはすべて同じです。 – mist

0

これはOSX上で正しく動作するようです。 しかし、Linuxではsysctlが廃止され、KERN_CLOCKRATEは未定義です。

#include <sys/sysctl.h> 
#include <sys/time.h> 

    int mib[2]; 
    size_t len; 
    mib[0] = CTL_KERN; 
    mib[1] = KERN_CLOCKRATE; 
    struct clockinfo clockinfo; 
    len = sizeof(clockinfo); 
    int result = sysctl(mib, 2, &clockinfo, &len, NULL, 0); 
    assert(result != -1); 
    log_trace("clockinfo.hz: %d\n", clockinfo.hz); 
    log_trace("clockinfo.tick: %d\n", clockinfo.tick); 
+0

コマンドラインで 'sysctl kern.clockrate'を実行すると、インテルCPUプロファイラがさまざまな変化を見せている安定した' kern.clockrate:{hz = 100、tick = 10000、tickadj = 2、profhz = 100、stathz = 100}私はこれがスピードステップ調整では機能しないと思っています。 – Tim

関連する問題