【问题标题】:optimize computing time优化计算时间
【发布时间】:2012-12-15 20:18:29
【问题描述】:

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

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

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

并行: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

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

注意:我在 Intel Core i7-740QM 上运行此程序

【问题讨论】:

  • 您是否考虑过告诉我们您的向量有多大以及(在较小程度上)您正在执行多少次迭代?这可能是有用的信息(考虑到性能权衡随大小而变化)。
  • 输出为:vlength = 500000;循环 = 1000;
  • 好的,现在我从在开始时填充向量的循环中删除了随机填充,并且在每个循环中标量产生了相同的向量,现在输出为:总时间(连续):2.42854 秒总时间(并行):1.028 秒,长度和循环编号相同。不应该是无关紧要的吗?
  • 你究竟是如何用随机数填充它们的?
  • 500k 是一个小向量。没有太多工作要做。尝试使用 50M,它应该更适合并行化。

标签: c++ optimization parallel-processing openmp


【解决方案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];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-08
    • 1970-01-01
    • 2019-08-07
    • 2015-04-17
    • 2019-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多