Ошибка использования вектора объекта в другом классе в ядре CUDA - PullRequest
0 голосов
/ 11 октября 2019

Я пытаюсь использовать вектор объекта (класса A) в другом классе (класс B) и в конечном итоге использую эту информацию в ядре (Foo) для инициализации другого вектора (матрицы). Но когда я пытаюсь скомпилировать код, я получаю сообщение об ошибке:

sample.cu (47): ошибка: вызов функции __host__ ("thrust :: detail :: vector_base <:: A,std :: allocator <:: A>> :: operator [] ") из функции __global__ (" Foo ") не допускается 1 обнаружена ошибка при компиляции" /tmp/tmpxft_00011073_00000000-9_sample.cpp1.ii".

Может кто-нибудь, пожалуйста, помогите мне исправить это. У меня не возникает проблем, когда я использую вектор класса B в ядре сам по себе.

#include <thrust/host_vector.h>

#include <thrust/device_vector.h>

#include <thrust/copy.h>

#include <iostream>

#include <cstdlib>

#ifdef __CUDACC__
# define HOST_DEVICE __host__ __device__
#else 
#define HOST_DEVICE
#endif

class A {
   public:
      int a;
   HOST_DEVICE A() {}
};

class B {
   public:
      int b;
   thrust::host_vector < A > B_A;
   HOST_DEVICE B() {}
};

__global__ void Foo(B * b, double * o) {
   int i = threadIdx.x + blockIdx.x * blockDim.x;

   o[i] = 2 * b[0].B_A[0].a;
}
int main() {

   thrust::host_vector < B > H_B;
   thrust::device_vector < B > D_B;
   B * b_ptr = thrust::raw_pointer_cast(H_B.data());

   thrust::device_vector < double > matrix(100);
   double * o = thrust::raw_pointer_cast(matrix.data());

   Foo << < 1, 2 >>> (b_ptr, o);

   return 0;
}
...