C 我的程序忽略omp并行区域中的for循环

C 我的程序忽略omp并行区域中的for循环,c,multithreading,openmp,C,Multithreading,Openmp,我必须做一个程序,用蒙特卡罗方法计算圆周率。所以我使用omp库来创建线程,没有显示任何错误,如果我将线程数设置为仅1个线程,它实际上可以工作。但是如果我尝试使用两个或更多线程,那么这个周期将被完全忽略。 知道为什么吗 #pragma omp parallel num_threads(threads) private(nthreads,points_inside) //parallel region { int tid_set_clock = omp_get_thread_

我必须做一个程序,用蒙特卡罗方法计算圆周率。所以我使用omp库来创建线程,没有显示任何错误,如果我将线程数设置为仅1个线程,它实际上可以工作。但是如果我尝试使用两个或更多线程,那么这个周期将被完全忽略。 知道为什么吗

#pragma omp parallel num_threads(threads) private(nthreads,points_inside) //parallel region
    {
        int tid_set_clock = omp_get_thread_num() + 1;
        srand(time(0)*tid_set_clock);
        double coord[2];//coordinates
        double dist_cent;//distance from center of a unitary circle to any point
        nthreads = omp_get_num_threads();
        for(int i=0;i<(num_points*(1/nthreads));i++){//generaion of N points
            coord[0] = 2*((double)rand()/(double)(RAND_MAX));
            coord[1] = 2*((double)rand()/(double)(RAND_MAX));
            dist_cent = sqrt(pow((1-coord[0]),2)+pow((1-coord[1]),2));
            if(dist_cent>=1){
                points_inside--;
            }
        }
    }
#pragma omp parallel num_threads(threads)private(n线程,内部点)//并行区域
{
int tid_set_clock=omp_get_thread_num()+1;
srand(时间(0)*tid设置时钟);
双坐标[2];//坐标
double dist_cent;//从一元圆中心到任意点的距离
nthreads=omp_get_num_threads();
对于(int i=0;i=1){
点_内--;
}
}
}
这是并行部分,如果线程数为1,它将正常工作,但是如果线程数为2或更多,它就不会进入for循环


知道发生了什么吗?

为什么要在并行块中调用
srand()
?而且
rand()
无论如何都不是线程安全的,所以不应该使用。(Notbdy every还记得
hypot()
是一个函数…)您的for循环从未运行过,因为1/2、1/3等都是0。此外,请使用
#pragma omp for
而不是手动拆分线程:它更易于读取并减少可能出现的错误/bug。“nthreads”是整数吗?如果是,则表达式(1/nthreads)的计算结果为零。因此循环中的迭代次数是0。谢谢大家,我修复了所有内容,效果非常好。为什么要在并行块中调用
srand()
?而且
rand()
无论如何都不是线程安全的,所以不应该使用。(Notbdy every还记得
hypot()
是一个函数…)您的for循环从未运行过,因为1/2、1/3等都是0。此外,请使用
#pragma omp for
而不是手动拆分线程:它更易于读取并减少可能出现的错误/bug。“nthreads”是整数吗?如果是,则表达式(1/nthreads)的计算结果为零。因此循环中的迭代次数是0。谢谢大家,我修复了所有问题,效果非常好