我试图比较计算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支持。