为什么稳定时钟在释放模式下测量为零?

时间:2017-05-18 16:13:01

标签: c++ openmp

我试图比较计算PI值的两种方法,一种是顺序的,另一种是并行的,并用稳定的时钟测量它们之间的差异。当我在调试模式下运行它们时,一切正常,两种方法的输出相当:

sequential: 2238223
parallel: 506050

我面临的问题是,当我在发布模式下进行编译时,steady_clock不会测量顺序版本的任何时间差异:

sequential: 0
parallel: 271027

另一件奇怪的事情是我正在打印这些值,并且在测试结束时我打印了两种方法返回的pi的值,并且控制台在顺序方法打印后立即打印0,该程序,然后它等待一段时间,直到打印并行方法的结果,然后它等待一段时间直到它打印出pi值的结果,让我觉得当需要打印pi的值时,程序正在执行第一个方法。

我的猜测是正确的,那为什么程序会有这种不同的行为?

这是两种方法的代码:

double ComputePIParallel()
{
    long long i;
    double area = 0;
    double h = 1.0 / n;
    #pragma omp parallel for shared(n, h) reduction(+:area) 
    for (i = 1; i <= n; i++)
    {
        double x = h * (i - 0.5);
        area += (4.0 / (1.0 + x*x));
    }
    double pi = h * area;
    return pi;
}

double ComputePISequntial()
{
    long long i;
    double area = 0;
    double h = 1.0 / n;
    for (i = 1; i <= n; i++)
    {
        double x = h * (i - 0.5);
        area += (4.0 / (1.0 + x*x));
    }
    return h * area;
}

和主要方法:

int main()
{
    steady_clock::time_point begin = steady_clock::now();
    double pi1 = ComputePISequntial();
    steady_clock::time_point end = steady_clock::now();
    long long duration = duration_cast<microseconds>(end - begin).count();

    cout<<"sequential: "<<duration<<endl;

    begin = steady_clock::now();
    double pi2 = ComputePIParallel();
    end = steady_clock::now();
    duration = duration_cast<microseconds>(end - begin).count();

    std::cout<<"parallel: "<<duration;

    std::cout<<endl<<pi1<<endl<<pi2;
    _getch();
    return 0;
}

n的值是100000000,它是全局的。该代码使用Visual Studio 2012中的MS编译器进行编译,并启用了Open MP支持。

0 个答案:

没有答案