2016-04-16 15 views
1

ここではCPU時間を計算するコードですが、gettimeofdayを使用すると、正しい時刻がmsで表示されるため、正しくありません。私は1つのプロセッサでプロセスを実行しており、そのクロックは800MHzで動作しています。次のようにRDTSCについての私の知識は、次のとおりrdtscを使用した秒計算

  • RDTSCは、1つのクロック・レート(800 MHZ)

    unsigned long long a,b; 
    unsigned long cpuMask; 
    cpuMask = 2; // bind to cpu 1 
    if(!sched_setaffinity(0, sizeof(cpuMask), &cpuMask)) 
    fprintf(stderr,"Running on one core!\n"); 
    setpriority(PRIO_PROCESS, 0, 20); 
    struct timeval t1, t2; 
    double elapsedTime; 
    int i=0; 
    // start timer 
    gettimeofday(&t1, NULL);  
    a = rdtsc(); 
    sleep(20);  
    //for(;i<1000000;i++); 
         //fprintf(stderr,"%d\n",i); 
    gettimeofday(&t2, NULL); 
    b = rdtsc(); 
    printf("a:%llu\n", a); 
    printf("b:%llu\n", b); 
    double val = ((b-a)/800000);   
    fprintf(stderr,"Time 1st through rdtsc in msec:%f\n\nSubtraction:%llu\n\n", val,b-a); 
    elapsedTime = (t2.tv_sec - t1.tv_sec) * 1000.0;  // sec to ms 
    elapsedTime += (t2.tv_usec - t1.tv_usec)/1000.0; // us to ms 
    fprintf(stderr,"Time through gettimeofday in ms:%f\n\n", elapsedTime); 
    
所与のCPU時間を算出することができるサイクルのもの#を使用してサイクル
  • の数を返します

  • 答えて

    1

    理論的には、rdtscがCPUサイクルと強い関連性を持つという保証はありません。 1サイクルは3 rdtsc単位に等しいかもしれない。実際には、constant_tsc機能が存在すると仮定すると、Intel CPUのrdtscユニットは(1秒/ max_frequency_of_cpu)になります。だから、最初の質問は:800MHzはです最大周波数ですかそれは現在周波数ですか?

    とにかく、clock_gettime(CLOCK_MONOTONIC_RAW, ...)は、おそらくあなたが使いたいものです。私は、タイムスタンプカウンタに正確にマッピングされ、OSの起動時にシステムクロックで較正されることを理解しています。

    (はい、あなたのコードは私のi7-3635QMで期待どおりに動作します)。

    関連する問題