Вектор тяги типа uint2: ошибка компилятора "has no member x"? - PullRequest
3 голосов
/ 27 декабря 2011

Я только начал использовать библиотеку Thrust. Я пытаюсь сделать вектор длиной 5 на устройстве. Ее я просто настраиваю на элементы первого элемента vec[0]

  #include<thrust/device_vector.h>
  #include<iostream>
  .
  . 
  . 

  thrust::device_vector<uint2> vec(5);
  vec[0]=make_uint2(4,5);
  std::cout<<vec[0].x<<std::endl;

Однако для приведенного выше кода я получаю ошибку

error: class "thrust::device_reference<uint2>" has no member "x"

1 error detected in the compilation of "/tmp/tmpxft_000020dc_00000000-4_test.cpp1.ii".

Куда я иду не так? Я думал, что доступ к члену родного векторного типа данных CUDA, например uint2 с .x и .y, был правильным способом.

1 Ответ

4 голосов
/ 29 декабря 2011

Как отмечает talonmies в своем комментарии, вы не можете напрямую получить доступ к элементам, принадлежащим device_vector, или любому объекту, заключенному в device_reference. Однако я хотел предоставить этот ответ, чтобы продемонстрировать альтернативный подход к вашей проблеме.

Хотя device_reference не позволяет вам получить доступ к членам обернутого объекта, он совместим с operator<<. Этот код должен работать как положено:

#include <thrust/device_vector.h>
#include <iostream>

// provide an overload for operator<<(ostream, uint2)
// as one is not provided otherwise
std::ostream &operator<<(std::ostream &os, const uint2 &x)
{
  os << x.x << ", " << x.y;
  return os;
}

int main()
{
  thrust::device_vector<uint2> vec(5);
  vec[0] = make_uint2(4,5);
  std::cout << vec[0] << std::endl;
  return 0;
}
...