2016-07-29 9 views
0

TBB를 사용하는 방법을 배우려고합니다. 따라서 복소수 배열의 거듭 제곱을 계산하도록 설계된 샘플 프로그램을 수정하고 있습니다. 원래는 parallel_for 루프에 배열을 전달하고 있었지만 벡터로 전달되도록 배열을 변경하려고합니다. 그러나, 나는 내 코드를 컴파일 할 수 없다. 나는 (사용 g ++ -g program_name.cpp -ltbb 컴파일) 다음과 같은 오류가 발생합니다 :C++ parallel_for 오류

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

내 코드는 다음과 같습니다 : 당신은에 비 mutable 멤버 필드 result을 수정하려는

#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; 
} 
+0

이 경우, 당신은 여전히'연산자 오류를 이해하지 못했다()'방법을 당신이하고있는'결과 [I] = Z;'. 이 메소드는'const'로 표시되며'const'로 표시된 메소드에서 데이터 멤버를 수정하지 않아야합니다. – Jagannath

답변

1

const - 정규화 operator()

이 불일치를 해결하십시오.

편집 # 1 : 위의 두 키워드에 대해서는 이미 언급했습니다. 다음 중 하나를

  1. operator()에서 const 한정자를 제거

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

    mutable vector<dcmplx> result; 
    

추가 erorrs이 등장 할 수있다 적용한 후 (강하게 선호하지만, 빨간색) 변형 번호. 1. 번호 2는 단지 완전성을위한 것이며 marginal situations에만 사용됩니다.

실제로 첫 번째 변형과 오류가 발생합니다. tbb::parallel_forFuncconst& (으)로 가져 오기 때문에 사용자의 펑터에서 const - 정식 멤버 함수 만 호출 할 수 있기 때문입니다. 왜? TBB는 큰 펑터를 복사하여 성능을 낭비하기를 원하지 않습니다 (STL은 값을 전달합니다).

여기에 일반적인 관행이 무엇인지 모르겠지만이 라이브러리를 사용한 적이 없습니다.


편집 # 2 : constoperator()을 restrict로도에,

vector<dcmplx> &result; 

지금 당신이 그것을 수정할 수 있습니다 : 아마 누락 된 모든 result가 참조 아니 었습니다 . 이후 파괴 된 회원을 수정하는 것은 의미가 없습니다.

참조로도 생성자의 서명을 y으로 변경하는 것을 잊지 마십시오.코드에서 주제 문제 오프


:

  • 는 전 세계적으로 for -loop

  • i에 대한 size_t

  • 사용하지 <vector> 헤더

  • using namespace bulky_namespace을 포함하지 않음

  • 어쩌면 더 ...

+0

답변 해 주셔서 대단히 감사합니다. 저는 C++을 처음 사용합니다. 어떻게해야합니까? – Student

+0

지속적인 답변을 보내 주셔서 감사합니다. 그렇다면 parallel_for를 벡터로 수정하는 방법이 없다는 뜻입니까? – Student

+0

@ 학생 이것은 한계 사례 *에 해당됩니다. 'mutable '이 작동해야합니다. – LogicStuff