2014-02-12 18 views
4

我正在從program1訪問共享庫(共享數組數據結構),並查找訪問時間以讀取該陣列的所有元素。我只有17000個刻度,而只有Program1單獨執行。與單進程場景​​相比,在多進程場景中意外降低訪問時間

現在,當我在另一個選項卡中先執行program2(具有空的while循環來終止它)時,然後運行program1並測量訪問時間以讀取該數組的所有元素。 令我驚訝的是,與以前只有Program1執行的場景相比,我獲得了8000ticks。

看起來像只有program1正在執行,與有2個程序時相比,讀取數組需要更多時間,program1執行與上一個相同的任務,而program2通過while循環保持CPU繁忙。期望的是存在program1時訪問時間更長,而實際結果則相反。

爲什麼會發生這種情況?

下面是共享庫

#include <stdio.h> 
static const int DATA[1024]={1 ,2 ,3,.....1024]; 
inline void foo(void) 
{ 
    int j, k=0,count=0; 

    for(j=0;j<1024;j++) 
     { 
     k=DATA[j]; 
     } 

    k+=0;  
} 

PROGRAM1

int main(void) 
    {  
    foo(); 

    start=timer(); 
    foo(); 
    end=timer(); 
    printf("Time1=%llu\n",end-start);  

    start=timer(); 
    foo(); 
    end=timer(); 
    printf("Time2=%llu\n",end-start);  


    start=timer(); 
    foo(); 
    end=timer(); 
    printf("Time3=%llu\n",end-start); 
    sleep(1); 

    start=timer(); 
    foo(); 
    end=timer(); 
    printf("after sleep(1)\n"); 
    printf("Time4=%llu\n",end-start);  

    start=timer(); 
    foo(); 
    end=timer(); 
    printf("Time5=%llu\n",end-start);  

    sleep(2); 
    start=timer(); 
    foo(); 
    end=timer(); 
    printf("after sleep(2)\n"); 
    printf("Time6=%llu\n",end-start);  

    return 0; 
    } 

程序2

int main(void) 
    { 
    while(1) 
     {}   
    return 0; 
    } 

CASE1(僅PROGRAM1運行)

輸出

Time1=17918 
Time2=17672 
Time3=17816 

after sleep(1) 
**Time4= 20716 ** // Is it due to wake up from sleep mode ? 
Time5=17722 

after sleep(2) 
**Time6=20910** // Is it due to wake up from sleep mode ? 

CASE1(Program2中運行,然後再PROGRAM1開始運行)

輸出

Time1 =7483 
Time2=7205 
Time3=7399 

after sleep(1) 
**Time4= 8734 ** // Is it due to wake up from sleep mode ? 
Time5=7326 

after sleep(2) 
**Time6=9070** // Is it due to wake up from sleep mode ? 

按我理解而使用CPU僅通過program1讀取數組所需的時間必須少於Program1和Program2使用CPU時的時間。

我在哪裏犯錯誤?我有i7機器,只有一個內核,超線程被禁用,禁用ASLR。

編輯1:

按Mysticial的建議下,我的CPU進入省電模式,而只有程序1是存在的,那麼CPU進入省電模式,然後從省電模式下喚醒它需要更長的訪問時間。所以他的建議是多次訪問DATA數組。

這是我修改的共享庫。 Program1和Program2沒有改變。

#include <stdio.h> 
static const int DATA[1024]={1 ,2 ,3,.....1024]; 
inline void foo(void) 
{ 
    int j, k=0,count=0; 
    while(count++<10000) 
    { 
    for(j=0;j<1024;j++) 
     { 
     k=DATA[j]; 
     } 
    } 
    k+=0;  
} 

現在的輸出是如下

CASE1(僅PROGRAM1運行)

輸出

Time1=75186246 
Time2=77570299 
Time3=80548529 

after sleep(1) 
**Time4= 92608363 ** // Is it due to wake up from sleep mode ? 
Time5=75616487 

after sleep(2) 
**Time6=97021338** // Is it due to wake up from sleep mode ? 

CASE1(Program2中運行,然後再PROGRAM1開始正在競選)

輸出

Time1 =139337099 
Time2=155801957 
Time3=146586856 

after sleep(1) 
**Time4= 130558062 ** // Why lower access time after sleep mode ? 
Time5=145250551 // Time5 is expected lower than Time4 as other run . Why lower here ? 

after sleep(2) 
**Time6=130940183** // Again Why lower access time after sleep mode ? 

這裏是我的關於修改共享庫

  1. 新問題,當沒有程序2,然後睡眠訪問時間後(與先前的訪問時間(t3/t5,在進入睡眠之前)相比較,更高的更高的。我能說,這是由於Mysticial解釋,從睡眠狀態喚醒CPU嗎?

  2. 現在,程序2在另一個選項卡運行時,睡眠訪問時間(T4/T6)之後是低相比於先前訪問時間(t3/T5,睡覺前)。我的q(1)和q(2)的原因是矛盾的。從睡眠中醒來後訪問時間縮短的原因是什麼(t4 < t3)?雖然我沒有多次訪問DATA數組(原始共享庫),但睡眠後的訪問時間更長。

  3. 爲什麼t2<t1 and t3<t2因爲共享庫已經加載到內存和緩存中而始終保持爲真。這是由於頁面切換?

我在linux下使用gcc。任何幫助理解這一點將不勝感激。提前致謝。

+0

除非您運行多次迭代,否則基準幾乎沒有意義。(足夠的迭代,以便基準測試持續幾秒鐘而不是瞬時)。如同單次迭代一樣,您可能會看到program2的影響,迫使CPU退出節能狀態。 – Mysticial

+0

@Mysticial感謝您的回答。你的意思是說,當我使用單次迭代來讀取相同的陣列CPU進入省電狀態,這就是爲什麼我得到更高的訪問時間(17000ticks)。當Program2使用while循環並保持CPU繁忙時,它會阻止CPU進入省電狀態。可能你是對的,因爲當我在程序2中使用睡眠(100)時,我也得到了更高的(17000個滴答聲)訪問時間。讓我檢查多個迭代,然後我會在這裏發佈結果。 – bholanath

+0

@Mysticial我通過多次迭代(10000)獲得預期結果(更高的訪問時間,而program2在場景中)。你能寫這個答案,以便我能接受這個。謝謝 。 – bholanath

回答

5

這裏是我的答案投機,這似乎已經在評論中得到了證實:

在原來的基準,你只運行一個每個迭代。因此,基準測試的運行時間不足以「平均」所有隨機性。

當您自己運行program1時,需要將CPU從省電狀態喚醒。這需要時間並可能導致運行時間更長。

當您將兩個程序一起運行時(首先從program2開始),program2會提前使CPU退出節能狀態。所以,當你運行program1時,這個熱身罰沒有實現。


一旦環基準需要更長的時間,這個熱身點球變得微不足道,你終於看到代碼的預期穩態性能。 (程序1本身速度更快)

+0

你能看到我更新的帖子和評論嗎? – bholanath

+0

循環迭代+1,但我不確定電源狀態。除非程序關聯到相同的核心,否則它們可能運行在不同的核心上,這些核心可以分開進入和退出電源狀態(除非您具有這種粒度,否則這些能力沒有太大意義,因爲另一核心贏了不喜歡動態的渦輪增壓)。 – Leeor

+0

@Leeor在我的機器中,我禁用了其他內核以及Hyper線程。 – bholanath