我使用的 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/