2017-06-04 236 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()的种子来解决这个问题。