2016-12-17 59 views
0

這裏是OpenMP的我的測試代碼爲什麼一個簡單的沒有OpenMP的環比它使用OpenMP更快

#include <stdio.h> 
#include <stdlib.h> 
#include <omp.h> 
#include <time.h> 


int main(int argc, char const *argv[]){ 

    double x[10000]; 
    clock_t start, end; 
    double cpu_time_used; 
    start = clock(); 

    #pragma omp parallel 
    #pragma omp for 
    for (int i = 0; i < 10000; ++i){ 
     x[i] = 1; 
    } 

    end = clock(); 
    cpu_time_used = ((double) (end - start))/CLOCKS_PER_SEC; 
    printf("%lf\n", cpu_time_used); 
    return 0; 
} 

我有以下兩個命令編譯代碼:

gcc test.c -o main 

的輸出朗姆酒main0.000039

然後我使用OpenMP

編譯

,輸出爲0.008020

誰能幫助我瞭解爲什麼會發生。事先感謝。

+0

我認爲你需要圍繞'#pragma omp for'循環的'#pragma omp parallel'聲明的括號 –

+0

你的意思是這樣嗎? '#pragma omp parallel {......}',我試過了,它是一樣的,不起作用。 –

+0

自從我使用openMP已經有一段時間了,但代碼的最大代價是線程的開銷管理。在更大的執行時間內,你會看到更大的收益(嘗試像100萬)。 –

回答

1

由於高性能標記在他的評論中如此雄辯地描述,創建線程和分發工作需要花費(開銷)。對於這樣一項小小的工作(39美元),開銷超過任何可能的收益。

也就是說,你的測量也是誤導。 clock衡量CPU時間,很可能不是你想要的(掛鐘)。有關更多詳細信息,請參閱this question

您可能會遇到的另一個誤解:只要x足夠大,簡單循環就會成爲內存限制。你可能不會看到你期望的加速。例如,在一個典型的四核心桌面系統上,您可能會看到1.5 x而不是4 x的加速。

+0

大量開銷與創建線程相關,這通常只發生在第一個並行區域。一個更現實的開銷測量(假設你的代碼有多個並行區域)在開始計時之前有一個空的並行區域,以便線程已經創建,並且你只是測量喚醒的正常開銷他們了。 –