parallel-processing - OpenMP 程序比顺序程序慢

标签 parallel-processing openmp

当我尝试以下代码时

double start = omp_get_wtime();

long i;

#pragma omp parallel for
    for (i = 0; i <= 1000000000; i++) {
        double x = rand();
    }

    double end = omp_get_wtime();

    printf("%f\n", end - start);

执行时间约为168秒,而顺序版本仅花费20秒。

我还是并行编程的新手。如何获得比顺序版本更快的并行版本?

最佳答案

随机数生成器rand(3)使用全局状态变量(隐藏在(g)libc实现中)。从多个线程访问它们会导致缓存问题,而且也不是线程安全的。您应该使用 rand_r(3) 调用以及线程私有(private)的 seed 参数:

long i;
unsigned seed;

#pragma omp parallel private(seed)
{
    // Initialise the random number generator with different seed in each thread
    // The following constants are chosen arbitrarily... use something more sensible
    seed = 25234 + 17*omp_get_thread_num();
    #pragma omp for
    for (i = 0; i <= 1000000000; i++) {
       double x = rand_r(&seed);
    }
}

请注意,并行执行时与串行执行时会产生不同的随机数流。我还推荐 erand48(3) 作为更好的(伪)随机数源。

关于parallel-processing - OpenMP 程序比顺序程序慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55611874/

相关文章:

file-io - 并行读取多个文件并将它们存储在共享变量中

c - OpenMP 自定义缩减变量

memory-management - 有没有一种简单的方法来准备 Fortran 代码以进行并行调用

c++ - omp 临界区后是否存在隐式 Barrier

algorithm - 哪些类型/类别的算法可以在 MapReduce 范例中重铸?

multithreading - Haskell:并行代码比顺序版本慢

multithreading - 有哪些不同类型的并行性?

go - 同步访问同一变量

c - 向前移动和矩阵中的索引

c++ - 如何将 GDB 与 openMP 和并行编程结合使用?