gpt4 book ai didi

c++ - 复杂 vector 与 openMP 的点积

转载 作者:搜寻专家 更新时间:2023-10-31 00:45:43 25 4
gpt4 key购买 nike

我使用的 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++ - 复杂 vector 与 openMP 的点积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6250411/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com