C++ parallel_for 错误

C++ parallel_for error

我正在尝试学习如何使用 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;
}

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

解决这个差异。

Edit #1: 我已经在上面提到了两个关键字。或者:

  1. operator() 中删除 const 限定符:

    void operator() ( const blocked_range<size_t>& r ) { ... }
    
  2. 使resultmutable:

    mutable vector<dcmplx> result;
    

应用后可能会出现其他错误(尽管 强烈推荐)变体编号。 1. 2号只是为了完整性,仅在marginal situations.

中使用

它确实会导致第一个变体出错。这是因为 tbb::parallel_for 通过 const& 获取 Func,所以它只能调用你的仿函数上的 const 限定的成员函数。为什么? TBB 不想通过复制大型仿函数来浪费性能(STL 按值传递它们)。

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


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

vector<dcmplx> &result;

现在您可以修改它,即使在 const 合格的 operator() 中也是如此。修改一个之后被破坏的成员是没有意义的。

不要忘记更改构造函数的签名以通过引用传递 y


您的代码中的题外话问题:

  • 不包括 <vector> header

  • using namespace bulky_namespace 全局

  • for-loop

  • 中未将 size_t 用于 i
  • 也许更多...