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: 我已经在上面提到了两个关键字。或者:
从 operator()
中删除 const
限定符:
void operator() ( const blocked_range<size_t>& r ) { ... }
使result
mutable
:
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
也许更多...
我正在尝试学习如何使用 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: 我已经在上面提到了两个关键字。或者:
从
operator()
中删除const
限定符:void operator() ( const blocked_range<size_t>& r ) { ... }
使
result
mutable
: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>
headerusing namespace bulky_namespace
全局在
for
-loop 中未将 也许更多...
size_t
用于 i