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

C++ 为什么稳定时钟在释放模式下测零?,c++,openmp,C++,Openmp,我试图比较两种计算PI值的方法,一种是顺序的,另一种是并行的,并用一个稳定的时钟测量它们之间的差异。在调试模式下运行时,一切正常,两种方法的输出相当: sequential: 2238223 parallel: 506050 double ComputePIParallel() { long long i; double area = 0; double h = 1.0 / n; #pragma omp parallel for shared(n, h) red

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

sequential: 2238223
parallel: 506050
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;
}
我面临的问题是,当我在发布模式下编译时,
稳定时钟
不会测量顺序版本的任何时间差:

sequential: 0
parallel: 271027
另一件奇怪的事情是,我正在打印值,在测试结束时,我正在打印两个方法返回的pi值,控制台立即为顺序方法打印0,在程序启动后,它等待了一段时间,直到打印并行方法的结果,然后,它还要等待一段时间,直到它打印出pi值的结果,这让我认为程序正在执行第一个方法,此时需要打印
pi
的值

我的猜测是对的,那么为什么程序有这种不同的行为呢

这是两种方法的代码:

sequential: 2238223
parallel: 506050
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;
}
double ComputePIParallel()
{
龙龙我;
双面积=0;
双h=1.0/n;
#pragma omp并行用于共享(n,h)缩减(+:面积)

对于(i=1;我可能编译器认为
computepIseQuantial
可以在编译时完成?可能编译器很聪明,认为
computepIseQuantial
独立于运行时值,因此可以在编译时计算。检查生成的汇编代码(例如)然后看看它是否得到了完全优化。要么编译器在编译时进行了计算,要么它注意到您从未使用结果,只是对其进行了优化。最好的方法是检查程序集…或者尝试在第一个持续时间内打印结果