Тип возврата CUDA Thrust

В настоящее время я пытаюсь использовать библиотеку Thrust, и у меня возникают проблемы с возвращаемыми типами.

  device_vector<int> input(5);

  input[0] = 0;
  input[1] = 2;
  input[2] = 5;
  input[3] = 7;
  input[4] = 8;

  pair<int*, int*> result= minmax_element(input.begin(), input.end());

дает ошибку:

 error : no suitable conversion function from "const thrust::detail::normal_iterator<thrust::device_ptr<int>>" to "int *" exists

Может ли кто-нибудь объяснить мне, как определить, каким должен быть тип возврата?

согласно документации возвращаемый тип

thrust::pair<ForwardIterator,ForwardIterator>

Однако это не работает для меня, может кто-нибудь объяснить!

Спасибо!


person Sharpie    schedule 24.07.2011    source источник
comment
Тогда почему бы вам не объявить result правильным типом? Даже в стандартной библиотеке C++ нет неявного преобразования из vector<T>::iterator в T*.   -  person Kerrek SB    schedule 25.07.2011
comment
Объясните, что именно? Итератор на int похож, но не совсем на указатель на int, я думаю, вам это понятно?   -  person leftaroundabout    schedule 25.07.2011
comment
Нет. Итератор — это итератор, int* — это int*. Никто не говорит, что они связаны, так что не ходите вокруг да около, притворяясь, что это так. (Не сомневайтесь в деталях реализации. Это не ваше дело.)   -  person Kerrek SB    schedule 25.07.2011
comment
@Kerrek: если вы имели в виду мой комментарий, я изменил почти то же самое на похожее: вы правы, это лучший способ сказать это. Они определенно похожи в том, что ведут себя одинаково по отношению к operator*.   -  person leftaroundabout    schedule 25.07.2011
comment
@leftroundabout: О, мне очень жаль, я думал, что комментарий был от ОП :-) Конечно, ты прав!   -  person Kerrek SB    schedule 25.07.2011


Ответы (1)


При именовании параметра шаблона ForwardIterator не называет какой-либо конкретный тип. Для наших целей мы можем рассматривать его как заполнитель для типа итератора, заданного для thrust::minmax_element:

template<typename ForwardIterator>
  thrust::pair<ForwardIterator,ForwardIterator> minmax_element(ForwardIterator first, ForwardIterator last);

Таким образом, minmax_element возвращает pair любого типа итератора, заданного ему в качестве аргументов.

В вашем случае minmax_element возвращает pair из device_vector<int>::iterators. Вы можете компилировать свой код, сделав result соответствующим pair:

device_vector<int> input(5);

input[0] = 0;
input[1] = 2;
input[2] = 5;
input[3] = 7;
input[4] = 8;

// we can use a typedef for brevity
typedef pair<device_vector<int>::iterator, device_vector<int>::iterator> result_type;

result_type result = minmax_element(input.begin(), input.end());

// check the results
assert(0 == *result.first);
assert(8 == *result.second);
person Jared Hoberock    schedule 27.07.2011