c++ - 使用 openMP 计算复 vector 的点积

标签 c++ openmp reduce dot-product

我使用的 openMP 版本不支持复杂参数的 reduce() 。我需要一个快速的点积函数,例如

std::complex< double > dot_prod( std::complex< double > *v1,std::complex< double > *v2,int dim )

{
    std::complex< double > sum=0.;
    int i;
# pragma omp parallel shared(sum)
# pragma omp for
    for (i=0; i<dim;i++ )
    {
#pragma omp critical
        {
            sum+=std::conj<double>(v1[i])*v2[i];
        }
    }
    return sum;
}

显然,这段代码并没有加速问题的解决,而是减慢了问题的解决速度。对于复杂的参数,您是否有一个快速的解决方案,无需使用reduce()?

最佳答案

作为第一步,每个线程都可以计算私有(private)总和,第二步可以将其组合成最终总和。在这种情况下,仅在最后一步才需要关键部分。

std::complex< double > dot_prod( std::complex< double > *v1,std::complex< double > *v2,int dim )
{
  std::complex< double > sum=0.;
  int i;
  # pragma omp parallel shared(sum)
  {
    std::complex< double > priv_sum = 0.;
    # pragma omp for
    for (i=0; i<dim;i++ )
    {
      priv_sum += std::conj<double>(v1[i])*v2[i];
    }

    #pragma omp critical
    {
      sum += priv_sum;
    }
  }
  return sum;
}

关于c++ - 使用 openMP 计算复 vector 的点积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6250411/

相关文章:

c++ - Linux C++ : How to properly use template specializations across multiple files?

c++ - 比较列表并给出列表 b 中不在列表 a 中的内容

c++ - 交换指针

c++ - 中值滤波器 OpenMP 优化

c++ - 将 openmp 与 odeint 和自适应步长一起使用

Javascript合并对象数组,不重复

c++ - 增加 Virtual Bytes 的操作和函数

c++ - 为什么ubuntu 12.04下的OpenMP比串口版本慢

javascript - 将对象数组数组简化为对象数组

Scala:将 map 列表与每个键的最大值合并的惯用方法?