使用非线程安全随机数生成器在C中对pi monte carlo更正OpenMP pragma

 11 发布于 2023-02-12 11:16

我需要一些帮助来将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状态设为全局,但它不会改变我的结果,也许我做错了.那么请你能帮我做出正确的改变吗?非常感谢你!

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有