程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了用于最小,最大,中位数,平均值的OpenMp C ++算法大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决用于最小,最大,中位数,平均值的OpenMp C ++算法?

开发过程中遇到用于最小,最大,中位数,平均值的OpenMp C ++算法的问题如何解决?下面主要结合日常开发的经验,给出你关于用于最小,最大,中位数,平均值的OpenMp C ++算法的解决方法建议,希望对你解决用于最小,最大,中位数,平均值的OpenMp C ++算法有所启发或帮助;

OpenMP(至少2.0)支持某些简单操作的缩减,但不支持max和min。

在下面的示例中,该reduction子句用于求和,而一个critical节用于使用线程局部变量无冲突地更新共享变量。

#include <iostream>
#include <cmath>

int main()
{
  double sum = 0;
  uint64_t ii;
  uint64_t maxii = 0;
  uint64_t maxii_shared = 0;
#pragma omp parallel shared(maxii_shared) private(ii) firstprivate(maxii)
  {
#pragma omp for reduction(+:sum) Nowait
    for(ii=0; ii<10000000000; ++ii)
      {
        sum += std::pow((doublE)ii, 2.0);
        if(ii > maxii) maxii = ii;
      }
#pragma omp critical 
    {
      if(maxii > maxii_shared) maxii_shared = maxii;
    }
  }
  std::cerr << "Sum: " << sum << " (" << maxii_shared << ")" << std::endl;
}

编辑:一个更清洁的实现:

#include <cmath>
#include <limits>
#include <vector>
#include <iostream>
#include <algorithm>
#include <tr1/random>

// sum the elements of v
double sum(const std::vector<double>& v)
{
  double sum = 0.0;
#pragma omp parallel for reduction(+:sum)
  for(size_t ii=0; ii< v.size(); ++ii)
    {
      sum += v[ii];
    }
  return sum;
}

// extract the minimum of v
double min(const std::vector<double>& v)
{
  double shared_min;
#pragma omp parallel 
  {
    double min = std::numeric_limits<double>::max();
#pragma omp for Nowait
    for(size_t ii=0; ii<v.size(); ++ii)
      {
        min = std::min(v[ii], min);
      }
#pragma omp critical 
    {
      shared_min = std::min(shared_min, min);
    }
  }
  return shared_min;
}

// generate a random vector and use sum and min functions.
int main()
{
  using namespace std;
  using namespace std::tr1;

  std::tr1::mt19937 ENGIne(time(0));
  std::tr1::uniform_real<> unigen(-1000.0,1000.0);
  std::tr1::variate_generator<std::tr1::mt19937, 
    std::tr1::uniform_real<> >gen(ENGIne, unigen);

  std::vector<double> random(1000000);
  std::generate(random.begin(), random.end(), gen);

  cout << "Sum: " << sum(random) << " Mean:" << sum(random)/random.size()
       << " Min:" << min(random) << endl;
}

解决方法

在google上搜索了一个提供一些简单的OpenMp算法的页面。也许有一个示例可以从庞大的数据数组中计算最小值,最大值,中位数,平均值,但我找不到它。

至少我通常会尝试将每个核心的阵列分成一个块,然后再进行一些边界计算,以获得完整阵列的结果。

我只是不想重新发明轮子。


补充说明:我知道有成千上万个可以简单简化的示例。例如计算PI。

const int num_steps = 100000; 
double x,sum = 0.0; 
const double step = 1.0/double(num_steps); 
#pragma omp parallel for reduction(+:sum) private(X) 
for (int i=1;i<= num_steps; i++){ 
  x = double(i-0.5)*step; 
  sum += 4.0/(1.0+x*X); 
} 
const double pi = step * sum;

但是,当这些算法无法使用时,几乎没有可简化算法的例子。

大佬总结

以上是大佬教程为你收集整理的用于最小,最大,中位数,平均值的OpenMp C ++算法全部内容,希望文章能够帮你解决用于最小,最大,中位数,平均值的OpenMp C ++算法所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。