NVidia Thrust device_vector of strings

Я начал использовать библиотеку NVidia Thrust, которая входит в набор инструментов CUDA 4.0, и хотел что-то проверить, прежде чем копать глубже. Я могу выполнить следующее, и во время сборки у меня не возникнет проблем:

thrust::host_vector <int> iVec;
thrust::device_vector <int> iVec2;
thrust::host_vector <std::string> sVec;

Когда я пытаюсь сделать следующее, я получаю сообщение об ошибке компиляции:

    thrust::device_vector <std::string> sVec2;

Я хотел бы знать, могу ли я предположить, что любой тип данных, который я могу использовать в векторе STL, должен использоваться в векторе тяги независимо от того, устройство это или хост? Или здесь есть ограничения, и я не должен ожидать, что это сработает?

Я получаю следующую ошибку:

Здесь я использую MSCV 2010.

CUDA не поддерживает стандартные типы контейнеров C ++ в коде устройства, в основном он ограничен только типами C ++ POD. Вы можете определить свои собственные классы для использования в графическом процессоре, но конструктор и функции-члены должны быть определены как функции CUDA

thrust::host_vector <int> iVec;
thrust::device_vector <int> iVec2;
thrust::host_vector <std::string> sVec;
, и все еще существует ряд ограничений на то, какие языковые функции поддерживаются в коде устройства.


person Fernando    schedule 09.05.2011    source источник
comment
c: \ program files \ nvidia gpu computing toolkit \ cuda \ v4.0 \ include \ thrust \ detail \ device \ cuda \ for_each.inl (93): ошибка C2027: использование неопределенного типа 'thust :: detail :: STATIC_ASSERTION_FAILURE' 1> с 1> [1> x = false 1>] 1> c: \ program files \ nvidia gpu computing toolkit \ cuda \ v4.0 \ include \ thust \ detail \ device \ dispatch \ for_each.h (56): см. ссылку на создание экземпляра шаблона функции 'RandomAccessIterator thrust :: detail :: device :: cuda :: for_each_n (RandomAccessIterator, Size, UnaryFunction)', который компилируется 1> с 1> [1> RandomAccessIterator = thrust :: detail :: normal_iterator>, 1> Size = __ w64 int, 1> UnaryFunction = thrust :: detail :: device_destroy_functor 1>] 1> c: \ program files \ nvidia gpu computing toolkit \ cuda \ v4.0 \ include \ thrust \ detail \ device \ for_each. inl (43): см. ссылку на создание экземпляра шаблона функции 'RandomAccessIterator thrust :: detail :: device :: dispatch :: for_each_n (Rand omAccessIterator, Size, UnaryFunction, thrust :: detail :: cuda_device_space_tag) 'компилируется 1> с 1> [1> RandomAccessIterator = thrust :: detail :: normal_iterator>, 1> OutputIterator = thrust :: detail :: normal_iterator>, 1 > Размер = __ w64 int, 1> UnaryFunction = thrust :: detail :: device_destroy_functor 1>] 1> c: \ program files \ nvidia gpu computing toolkit \ cuda \ v4.0 \ include \ thrust \ detail \ device \ for_each.inl (54): см. Ссылку на создание экземпляра шаблона функции «OutputIterator thrust :: detail :: device :: for_each_n (OutputIterator, Size, UnaryFunction)», компилируемого 1> с 1> [1> OutputIterator = thrust :: detail :: normal_iterator> , 1> InputIterator = thrust :: detail :: normal_iterator>, 1> UnaryFunction = thrust :: detail :: device_destroy_functor, 1> Size = __ w64 int 1>] 1> c: \ program files \ nvidia gpu computing toolkit \ cuda \ v4.0 \ включить \ тягу \ де tail \ dispatch \ for_each.h (72): см. ссылку на создание экземпляра шаблона функции 'InputIterator thrust :: detail :: device :: for_each (InputIterator, InputIterator, UnaryFunction)' компилируется 1> с 1> [1> InputIterator = thust :: detail :: normal_iterator>, 1> UnaryFunction = thrust :: detail :: device_destroy_functor 1>] 1> c: \ program files \ nvidia gpu computing toolkit \ cuda \ v4.0 \ include \ thrust \ detail \ for_each.inl (51): см. Ссылку на создание экземпляра шаблона функции «InputIterator thrust :: detail :: dispatch :: for_each (InputIterator, InputIterator, UnaryFunction, thrust :: device_space_tag)», который компилируется 1> с 1> [1> InputIterator = thrust :: detail :: normal_iterator>, 1> UnaryFunction = thust :: detail :: device_destroy_functor 1>] 1> c: \ program files \ nvidia gpu computing toolkit \ cuda \ v4. 0 \ include \ thrust \ detail \ for_each.inl (67): см. Ссылку на создание экземпляра шаблона функции 'InputIterator thrust :: detail :: for_each (InputIterator, InputIterator, UnaryFunction)', который компилируется 1> с 1> [1> InputIterator = thust :: detail :: normal_iterator>, 1> UnaryFunction = thrust :: detail :: device_destroy_functor 1>] 1> c: \ program files \ nvidia gpu computing toolkit \ cuda \ v4.0 \ include \ thust \ detail \ dispatch \ destroy.h (59): см. ссылку на создание экземпляра шаблона функции 'void thrust :: for_each> (InputIterator, InputIterator, UnaryFunction)', который компилируется 1> с 1> [1> ForwardIterator = thrust :: detail :: normal_iterator>, 1 > T = value_type, 1> InputIterator = thust :: detail :: normal_iterator>, 1> UnaryFunction = thrust :: detail :: device_destroy_functor 1>] 1> c: \ program files \ nvidia gpu computing toolkit \ cuda \ v4.0 \ include \ thust \ detail \ destroy.h (42): см. ссылка на создание экземпляра шаблона функции 'void thrust :: detail :: dispatch :: destroy (ForwardIterator, ForwardIterator, thrust :: detail :: false_type)' компилируется 1> с 1> [1> ForwardIterator = thrust :: detail :: normal_iterator > 1>] 1> c: \ program files \ nvidia gpu computing toolkit \ cuda \ v4.0 \ include \ thrust \ detail \ vector_base.inl (442): см. Ссылку на создание экземпляра шаблона функции void thrust :: detail :: destroy> (ForwardIterator, ForwardIterator) 'компилируется 1> с 1> [1> Pointer = thrust :: device_ptr, 1> ForwardIterator = thrust :: detail :: normal_iterator> 1>] 1> c: \ program files \ nvidia gpu вычислительный инструментарий \ cuda \ v4.0 \ include \ thrust \ detail \ vector_base.inl (440): при компиляции функции-члена шаблона класса 'thust :: detail :: vector_base :: ~ vector_base (void)' 1> с 1> [ 1> T = std :: string, 1> Alloc = thust :: device_malloc_allocator 1> ] 1> c: \ program files \ nvidia gpu computing toolkit \ cuda \ v4.0 \ include \ thrust \ device_vector.h (55): см. Ссылку на компилируемый экземпляр шаблона класса thust :: detail :: vector_base 1> с 1> [1> T = std :: string, 1> Alloc = thrust :: device_malloc_allocator 1>] 1> c: \ users \ fsquared \ mydata \ idata \ main.cpp (119): см. ссылку на создание экземпляра шаблона класса 'thust :: device_vector' компилируется 1> с 1> [1> T = std :: string 1>] ========== Сборка: 0 выполнено успешно, 1 не выполнено, 0 обновлено, 0 пропущено ==========   -  person Christian Rau    schedule 09.05.2011


Ответы (1)


У меня нет опыта работы ни с CUDA, ни с толчком (поэтому это не ответ), но я думаю, что тип данных должен поддерживаться на устройстве, а я сомневаюсь, что класс C ++ будет поддерживаться в CUDA. Также имейте в виду, что std :: string - это не простой стандартный тип данных, а класс C ++, тоже не простой (много шаблонов). Он мог работать с указателями на строки или с простыми старыми массивами символов, но все это я только догадывался.

person talonmies    schedule 09.05.2011