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("%fn", end - start);

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

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

随机数生成器rand(3)使用全局状态变量(隐藏在 (g(libc 实现中(。从多个线程访问它们会导致缓存问题,并且也不是线程安全的。您应该将rand_r(3)调用与线程专用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)作为更好的(伪(随机数源。

最新更新