C++ 在不同线程中写入共享变量不';与openMP进行数据竞争

C++ 在不同线程中写入共享变量不';与openMP进行数据竞争,c++,multithreading,openmp,C++,Multithreading,Openmp,我目前正在学习openMP基础知识,所以我选择了一个简单的练习并开始解决:我得到了一个近似Pi值的串行程序的实现,我被要求给出它的并行实现 串行程序: static long num_steps = 100000; double step; void main () { int i; double x, pi, sum = 0.0; step = 1.0/(double) num_steps; for (i=0;i< num_st

我目前正在学习openMP基础知识,所以我选择了一个简单的练习并开始解决:我得到了一个近似Pi值的串行程序的实现,我被要求给出它的并行实现

串行程序:

static long num_steps = 100000;
double step;
void main ()
{           
    int i;   
    double x, pi, sum = 0.0;
    step = 1.0/(double) num_steps;
    for (i=0;i< num_steps; i++){
         x = (i+0.5)*step;
         sum = sum + 4.0/(1.0+x*x);
    }
    pi = step * sum;
}
static long num_steps=100000;
双台阶;
空干管()
{           
int i;
双x,π,和=0.0;
步长=1.0/(双)个步长;
对于(i=0;i
它计算的是0到1之间4.0/(1+x²)dx积分的近似值

本教程使用增量方法,在每个步骤中提供一小部分,因此现在,我可以将并行构造与一些运行时函数一起使用

对我来说,最明显要做的就是除法和部分求和。以下是我的解决方案:

int main()
{
    const long num_steps = 100000;
    double step;
    double pi, sum = 0.0;
    step = 1.0/(double) num_steps;
    int num_steps_perthread = num_steps/4;
    double start_time = omp_get_wtime();
    #pragma omp parallel num_threads(4)
    {
        double x,partial_sum = 0.0;
        int init = num_steps_perthread * omp_get_thread_num();
        std::cout << init <<"\n";

        for (int i = init;i< init+num_steps_perthread; i++){
            x = (i+0.5)*step;
            partial_sum += 4.0/(1.0+x*x);
        }
        sum += partial_sum;// this line data race
    }
    pi = step * sum;
    double time = omp_get_wtime() - start_time;
    std::cout << pi << " computed in " << time;


    return 0;
}
intmain()
{
const long num_steps=100000;
双台阶;
双pi,总和=0.0;
步长=1.0/(双)个步长;
int num_steps_perthread=num_steps/4;
双启动时间=omp\U get\U wtime();
#pragma omp并行num_线程(4)
{
双x,部分和=0.0;
int init=num_steps_perthread*omp_get_thread_num();

std::cout是的,这是由于多线程对共享对象的非同步、非原子、非只读访问而导致的未定义行为。不,未定义的行为不需要意外结果。它不需要任何东西。在这种特殊情况下,很难发生数据争用。对共享变量的更新仅在他进行计算,只需要几个CPU周期。线程通常在时间上的不同步程度远远超过这个。数据争用是随机事件,它们发生的概率与(可能的)重叠内存访问的频率成正比。