我需要一些帮助来将pi计算与monte carlo方法并行化,使用给定的随机数生成器进行openmp,这不是线程安全的.
第一:这个 SO线程没有帮助我.
我自己尝试的是以下#pragma omp语句.我认为i,x和y变量应该由每个线程初始化,而不应该是私有的.z是圆圈中所有命中的总和,因此它应该在for循环后隐含的barriere之后求和.
认为主要问题是随机数发生器的静态状态变量.我创建了一个调用函数的关键部分,因此每次只有一个线程可以执行它.但Pi解决方案不能随着更高的值而扩展.
注意:我不应该使用其他RNG,但可以对其进行少量更改.
int main (int argc, char *argv[]) { int i, z = 0, threads = 8, iters = 100000; double x,y, pi; #pragma omp parallel firstprivate(i,x,y) reduction(+:z) num_threads(threads) for (i=0; i这个RNG实际上是一个包含文件,但由于我不确定我是否正确创建了头文件,我将其集成到另一个程序文件中,因此我只有一个.c文件.
#define RNG_MOD 741025 int rng_int(void) { static int state = 0; return (state = (1366 * state + 150889) % RNG_MOD); } double rng_doub(double range) { return ((double) rng_int()) / (double) ((RNG_MOD - 1)/range); }我也尝试将静态int状态设为全局,但它不会改变我的结果,也许我做错了.那么请你能帮我做出正确的改变吗?非常感谢你!