OpenMP 圆周率计算的并行化要么很慢,要么是错误的

2023-11-30

我在并行化我的蒙特卡罗方法来计算 pi 时遇到问题。这是并行的 for 循环:

#pragma omp parallel for private(i,x,y) schedule(static) reduction(+:count)
  for (i = 0; i < points; i++) {
    x = rand()/(RAND_MAX+1.0)*2 - 1.0;
    y = rand()/(RAND_MAX+1.0)*2 - 1.0;

    // Check if point lies in circle
    if(x*x + y*y < 1.0) { count++; }
  }

问题是,如果我使用它,它会低估 pischedule(static),如果我使用它,它比串行实现慢schedule(dynamic)。我究竟做错了什么?我尝试过其他方法来修复它(例如:使用OpenMP计算PI值)但它仍然比串行实现慢得多。

提前致谢


假设您正在使用 C 库rand函数,该函数不是可重入的或线程安全的。 POSIX 提供了一个rand_r函数,但是(引用 glibc 文档):

POSIX.1 扩展了 C 标准函数以支持可重现 多线程程序中的随机数。然而,扩展名是 设计糟糕,不适合严肃的工作。

特别是,种子必须是无符号整型,它没有足够的位来实现良好的 PRNG。他们建议使用 SVID 随机数函数,其中nrand48_r可能就是您正在寻找的。

或者,您可以使用不同的库。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenMP 圆周率计算的并行化要么很慢,要么是错误的 的相关文章

随机推荐