C operators and CUDA

Написал простенький оператор, а cuda его не схватывает(всё скорее всего не понадобится смотреть, только первый оператор, но решил, что лишним не будет).

  1. extern "C"
  2. struct Tensor2Gen
  3. {
  4.  
  5.       double a[9];
  6.       //this is operator causing error
  7.       Tensor2Gen& operator=(short i)
  8.           {
  9.                   for (int i=0; i<9; i++) a[i] = i;
  10.                   return *this;
  11.           }; //strange error occures here
  12.  
  13.       Tensor2Gen& operator+=( const Tensor2Gen &B )
  14.       {
  15.          for ( int i=0; i<9; i++ ) a[i] += B.a[i];
  16.          return *this;
  17.       }
  18.  
  19.       Tensor2Gen& operator-=(const Tensor2Gen& B)
  20.       {
  21.          for ( int i=0; i<9; i++ ) a[i] -= B.a[i];
  22.          return *this;
  23.       }
  24.  
  25.       Tensor2Gen& operator*=(double s)
  26.       {
  27.          for ( int i=0; i<9; i++ ) a[i] *= s;
  28.          return *this;
  29.       }
  30.  
  31.           Tensor2Gen operator *(double s) //think of heap and stack
  32.           {
  33.                  Tensor2Gen t;
  34.                  for (int i=0; i<9; i++)
  35.                  {
  36.                          t.a[i] = this->a[i];
  37.                          t.a[i] *= s;
  38.                  }
  39.                  return t;
  40.           }
  41.  
  42.           Tensor2Gen operator+( const Tensor2Gen &B )
  43.       {
  44.                  Tensor2Gen t;
  45.                  for (int i=0; i<9; i++)
  46.                  {
  47.                          t.a[i] = this->a[i];
  48.                          t.a[i] += B.a[i];
  49.                  }
  50.                  return t;
  51.       }
  52.  
  53.       Tensor2Gen& operator/=(double s)
  54.       {
  55.          double m=1.0/s;
  56.          for ( int i=0; i<9; i++ ) a[i] *= m;
  57.          return *this;
  58.       }
  59.  
  60.       double& operator()(int i, int j)
  61.       {
  62.          assert( i>0 && i<4 );
  63.          assert( j>0 && j<4 );
  64.          return a[(j-1)*3+i-1];
  65.       }
  66.  
  67.       void fill(double val){
  68.           for ( int i=0; i<9; i++ ) a[i] = val;
  69.       }
  70.          
  71.           double& getSk(int i, int j)
  72.       {
  73.          assert( i>0 && i<4 );
  74.          assert( j>0 && j<4 );
  75.          return a[(j-1)*3+i-1];
  76.       }
  77.           Tensor1 operator*( Tensor1 b )
  78.                 {
  79.                    Tensor1 r;
  80.                    double b1=b(1), b2=b(2), b3=b(3);
  81.  
  82.                    r(1) = getSk(1,1)*b1 + getSk(1,2)*b2 + getSk(1,3)*b3;
  83.                    r(2) = getSk(2,1)*b1 + getSk(2,2)*b2 + getSk(2,3)*b3;
  84.                    r(3) = getSk(3,1)*b1 + getSk(3,2)*b2 + getSk(3,3)*b3;
  85.  
  86.                    return r;
  87.                 }
  88. };

Пытаюсь в cuda-функции сделать следующее(в комментах видно, как я избавляюсь от оператора и всё работает):

  1. __device__ void cudaClearValues(Particle &p){
  2.   p.velocity = Vector();
  3.   p.acceleration = Vector();
  4.   p.energy = 0;
  5.   p.pressure = 0;
  6.   p.density = 0;
  7.  //there are first problems with operators and my tensor structures
  8.   //p.tDeformation = 0; //Tensor2Gen field. In this way function doesn't work
  9.  for (int i=0; i<9; i++)
  10.         p.tDeformation.a[i] = 0; //this way is acceptable :)
  11.  // p.tStressDev = 0; //Tensor2Gen field
  12.  
  13.   p.deformWork = 0;
  14.   p.crack = 0;
  15.   p.state = 0;
  16.  
  17. }

У меня далее много функций с операторами и не хотелось бы встрять из-за этой проблемы.

Forums: