gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 08:09:51 24 4
gpt4 key购买 nike

当我尝试以下代码时

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)调用 seed线程私有(private)参数:

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/10624755/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com