2017-06-04 44 views
1

我想在C中使用OpenMP初始化一個動態數組,但它似乎比串行方法慢。我正在使用的功能是OpenMP - 初始化一維數組

int* createArray(int size, int num) { 
    int i; 
    int* M = (int*)malloc(size*sizeof(int)); 

    srand(time(NULL)); 
    double start = omp_get_wtime(); 

    #pragma omp parallel for num_threads(num) 
    for (i = 0; i < size; i++) { 
     M[i] = rand() % (MAX_NUMBER - MIN_NUMBER + 1) + MIN_NUMBER; 
    } 

    double end = omp_get_wtime(); 
    printf("Create Array %f\n",end-start); 
    return M; 
} 

我得到一個包含隨機數的給定大小的數組,但我使用的線程越少功能越快。難道我做錯了什麼?

+1

有很多Q和As在這裏解釋爲什麼不使用'rand'在OpenMP程序中。例如:https://stackoverflow.com/questions/10624755/openmp-program-is-slower-than-sequential-one/10625090#10625090 –

+2

[OpenMP程序可能重複的速度比順序的慢](https:// stackoverflow.com/questions/10624755/openmp-program-is-slower-than-sequential-one) – Zulan

回答

1

通常,運行比相應順序執行慢的並行應用程序通常來自啓動線程的開銷或具有不完全獨立線程的瓶頸(例如,例如通過共享數據)。

在這裏,前者是真實的,因爲你打電話給rand()。該函數使用某種方式必須在線程之間共享的全局變量。解決這個問題的方法是爲每個線程使用private種子。此外,你有沒有注意到當你有多個線程時,你的數組是不是隨機的?你可以通過omp_get_thread_num()的功能來提供給srand()的種子來解決這個問題。