gpt4 book ai didi

C++ parallel_for 错误

转载 作者:行者123 更新时间:2023-11-28 05:34:23 24 4
gpt4 key购买 nike

我正在尝试学习如何使用 TBB,因此我正在修改我发现的示例程序,该程序旨在计算复数数组的幂。最初,它是将一个数组传递到 parallel_for 循环中,但我试图对其进行更改,以便它传递一个 vector 。但是,我无法编译我的代码;我收到以下错误(使用 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;
}

最佳答案

您正在尝试修改非 mutable成员(member)栏resultconst -合格operator() .

解决这个差异。

编辑 #1: 我已经在上面提到了两个关键字。要么:

  1. 删除 const来自 operator() 的限定符:

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

    mutable vector<dcmplx> result;

应用(尽管强烈推荐)变体号后可能会出现其他错误。 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对于 ifor -循环

  • 也许更多...

关于C++ parallel_for 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38667936/

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