优化计算时间

时间:2012-12-15 20:18:29

标签: c++ optimization parallel-processing openmp

我正在经历平行标量产生两个向量并测量经过的时间。 我在比较顺序和并行标量产品:

seq:double scalar(int n, double x[], double y[])

for (int i=0; i<n; i++)
{
   sum += x[i]*y[i];
}

parallel:double scalar_shm(int n, double x[], double y[])

#pragma omp parallel for private(i) shared(x,y) reduction(+:sum)
for (i=0; i<n; i++)
{
   sum += x[i]*y[i];
}

我一个接一个地打电话给他们:

//sequential loop
for (int n=0; n<loops; n++)
{ scalar(vlength,x,y); }

//measure sequential time
t1 = omp_get_wtime() - tstart;

//parallel loop
for (int n=0; n<loops; n++)
{ scalar_shm(vlength,x,y); }

//measure parallel time
t2 = omp_get_wtime() - t1 - tstart;

//print the times elapsed
cout<< "total time (sequential): " <<t1 <<" sec" <<endl;
cout<< "total time (parallel  ): " <<t2 <<" sec" <<endl;

每个周期我用随机双打填充向量,我删除了那部分,因为我认为它无关紧要。

这个输出是:

total time (sequential): 15.3439 sec
total time (parallel  ): 24.5755 sec

我的问题是为什么并行速度较慢?如果速度慢的话会有什么好处?我预计它会更快,因为我认为像这样的计算就是它的重点。

注意:我是在英特尔酷睿i7-740QM上运行的

1 个答案:

答案 0 :(得分:1)

您正在为每次迭代创建并销毁新的并行段代码。此操作非常慢。您可以尝试在内部循环外创建并行部分:

//parallel loop
int sum;
#pragma omp parallel private(n) reduction(+:sum)
{
    for (int n=0; n<loops; n++)
    { 
       scalar_shm(vlength,x,y, sum); 
    }
}

在scalar_shm函数中,OpenMP pragma将是:

#pragma omp for private(i)
for (i=0; i<n; i++)
{
   sum += x[i]*y[i];
}