C ++ parallel_for错误

时间:2016-07-29 21:45:55

标签: c++ tbb function-object

我正在尝试学习如何使用TBB,因此我正在修改一个示例程序,我发现它旨在计算复数数组的幂。最初,它将一个数组传递给parallel_for循环,但我试图改变它以便它传递给一个向量。但是,我无法编译代码;我收到以下错误(使用g ++ -g program_name.cpp -ltbb编译):

error: passing ‘const std::complex<double>’ as ‘this’ argument
       discards qualifiers [-fpermissive] result[i] = z;

我的代码如下:

#include <cstdlib>
#include <cmath>
#include <complex>
#include <ctime>
#include <iostream>
#include <iomanip>
#include "tbb/tbb.h"
#include "tbb/blocked_range.h"
#include "tbb/parallel_for.h"
#include "tbb/parallel_for_each.h"
#include "tbb/task_scheduler_init.h"

using namespace std;
using namespace tbb;
typedef complex<double> dcmplx;

dcmplx random_dcmplx ( void )
{
   double e = 2*M_PI*((double) rand())/RAND_MAX;
   dcmplx c(cos(e),sin(e));
   return c;
}

class ComputePowers
{
   vector<dcmplx>  c; // numbers on input
   int d;           // degree
   vector<dcmplx>  result;  // output
   public:
      ComputePowers(vector<dcmplx> x, int deg, vector<dcmplx> y): c(x), d(deg), result(y) { }

      void operator() ( const blocked_range<size_t>& r ) const
      {
         for(int i=r.begin(); i!=r.end(); ++i)
         {
            dcmplx z(1.0,0.0);
            for(int j=0; j < d; j++) {
                z = z*c[i];
            };
            result[i] = z;
         }
      }
};

int main ( int argc, char *argv[] )
{
   int deg = 100;
   int dim = 10;

   vector<dcmplx> r;
   for(int i=0; i<dim; i++)
     r.push_back(random_dcmplx());

   vector<dcmplx> s(dim);

   task_scheduler_init init(task_scheduler_init::automatic);

   parallel_for(blocked_range<size_t>(0,dim),
                ComputePowers(r,deg,s));
   for(int i=0; i<dim; i++)
       cout << scientific << setprecision(4)
       << "x[" << i << "] = ( " << s[i].real()
       << " , " << s[i].imag() << ")\n";
   return 0;
}

1 个答案:

答案 0 :(得分:1)

您正在尝试修改mutable中的非result成员字段const - 合格operator()

解决这种差异。

编辑#1:我已经提到了上面的两个关键字。之一:

  1. const移除operator()限定符:

    void operator() ( const blocked_range<size_t>& r ) { ... }
    
  2. 制作result mutable

    mutable vector<dcmplx> result;
    
  3. 在申请(尽管强烈偏好)变种号后,可能会出现其他错误。 1.第2号仅用于完整性,仅用于marginal situations

    确实会导致第一个变体出错。这是因为tbb::parallel_for需要Func const&,因此它只能在您的仿函数上调用const - 合格的成员函数。为什么? TBB并不想通过复制大型仿函数来浪费性能(STL通过值传递它们)。

    我不知道这里常见的做法是什么,我从未使用过这个库。

    编辑#2:您可能遗失的只是result不是参考:

    vector<dcmplx> &result;
    

    现在,即使在const - 合格operator()中,您也可以对其进行修改。修改后来被破坏的成员是没有意义的。

    请勿忘记更改构造函数的签名,以便通过引用传递y

    代码中的主题问题:

    • 未包含<vector>标题

    • 全球
    • using namespace bulky_namespace

    • size_t循环

    • 中未i使用for
    • 或许更多......