Edd*_*ddy 4 c c++ parallel-processing openmp
我无法并行化我的monte carlo方法来计算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++; }
}
Run Code Online (Sandbox Code Playgroud)
问题是,如果我使用它会低估pi,如果我使用它schedule(static),它比串行实现慢schedule(dynamic).我究竟做错了什么?我已经尝试了其他方法来修复它(像这样:使用OpenMP计算PI的值),但它仍然比串行实现慢得多.
提前致谢
假设您正在使用C库rand函数,该函数不可重入或线程安全.POSIX提供了一个rand_r函数,但是(引用glibc文档):
POSIX.1扩展了C标准函数,以支持多线程程序中可重现的随机数.但是,扩展设计糟糕,不适合认真工作.
特别是,种子必须是unsigned int,它没有足够的位用于良好的PRNG.他们建议使用SVID随机数函数,这nrand48_r可能是您正在寻找的.
或者,您可以使用其他库.
| 归档时间: |
|
| 查看次数: |
1192 次 |
| 最近记录: |