2013-10-28 106 views
1

想知道爲什麼將一個for循環分成兩個這樣的線程會使我的性能下降幾乎減少一倍?我正在使用雙核處理器。多線程for循環在C

正常循環(1.78 S):

int var; 
for (i = 0; i < n; i++) 
     for (j=0; j < p; j++){ 
       var = 0; 
       for (k=0; k < m; k++) 
         var = i + k; 
     } 

分環路(2.53 S):

pthread_create(&tid[0], NULL, A, NULL); 
pthread_create(&tid[1], NULL, B, NULL); 
for (i=0; i < 2; i++) pthread_join(tid[i],NULL) == 0; 

...

void * A(void *arg) 
{ 
    int i, j, k, var; 
    for (i = 0; i < n/2; i++) 
     for (j=0; j < p; j++) 
     { 
       var = 0; 
       for (k=0; k < m; k++) 
        var = i + k; 
     } 

    pthread_exit(NULL); 
} 


void * B(void *arg) 
{ 
     int i, j, k, var; 
     for (i = n/2; i < n; i++) 
      for (j=0; j < p; j++) 
      { 
       var = 0; 
       for (k=0; k < m; k++) 
        var = i + k; 
      } 
     pthread_exit(NULL); 
} 
+1

它可能與內存訪問有關嗎?我試圖從循環中刪除內存訪問,然後回去測試我的單線程和雙線程循環,看看是否有速度增加,然後加回內存讀取和基準,然後加回寫入和基準?我沒有這方面的經驗;這只是我將如何處理故障排除。 –

+1

實際上,我首先想知道它是否使用了兩個內核 - 您正在運行哪些操作系統,是否在單個進程內分割內核,在什麼條件下等等。 –

+0

「相同的性能」意味着它在兩秒內運行?或半個小時?要麼? – Macattack

回答

1

我想通了。我使用全局變量(i,j,k,x,y,z等)來遍歷循環。我沒有在例子中顯示,所以你不會知道。這顯然增加了很多開銷。現在它可以正常使用每個線程的局部變量。

+0

是的,這解釋了很多......我希望告訴你爲什麼[SSCCE](http://meta.stackexchange.com/q/22754)是個好主意。 :-) – torek

+0

這不是真正的問題答案,因爲它只是說代碼改變時軟件行爲有所不同,沒有解釋爲什麼。您認爲添加的開銷的來源是什麼?在問題的源代碼中,循環變量i,j和k全都是局部變量,就像變量var一樣。變量n,p和m沒有在函數中定義,所以我假設它是全局的。那些全局變量是如何定義的? –

+0

n,p和m是宏。我不完全確定的解釋。如果我猜測,這將是全局變量不分配給堆棧,這需要更長的訪問時間,因爲沒有指向它們的指針...?這是一個更長的搜索。 – Riftus