c - OpenMP - 初始化一维数组

标签 c openmp

我正在尝试在 C 中使用 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;
}

我得到一个包含随机数的给定大小的数组,但我使用的线程越少,函数运行得越快。难道我做错了什么?

最佳答案

一般来说,并行应用程序运行速度比相应的顺序实现慢通常是因为启动线程的开销或线程不是完全独立的瓶颈(例如通过共享数据) .

在这里,前者为真,因为您正在调用 rand()。此函数以某种方式使用必须在线程之间共享的全局变量。克服这个问题的一种方法是为每个线程使用一个 private 种子。此外,您是否注意到,当您有多个线程时,您的数组并不是真正随机的?您可以将提供给 srand() 的种子作为 omp_get_thread_num() 的函数来解决这个问题。

关于c - OpenMP - 初始化一维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44357044/

相关文章:

c++ - OpenMP 和部分

fortran - 在 Fortran 上使用 openmp 和 fftw

c - 使用 gets() 将字符串保存到结构中?

c - 在最近的 Linux 内核上测试 msync 使用的好方法是什么?

c - getopt 值保持为空

c++ - 如何在使用 openMP 时初始化 threadprivate 动态数组?

c - 在与定义相同的文件中使用外部声明的好处?

c - 这个程序有什么问题吗?它无法正常运行

c++ - OpenMP 截断 float

c - 为什么 openmp 不并行化这段代码?