Emad Rawashdeh
Emad Rawashdeh

Reputation: 11

Thrust Device Vector iterator location

i am trying to find the index/location of an iterator, i use the thrust::distance(). however, it returns weird value. the vector size is 10. and when i use this method it returns value of "131" . here is a fully working example.

#include <thrust/device_vector.h>
#include <thrust/host_vector.h>
#include <thrust/reduce.h>
#include <thrust/extrema.h>
#include <iostream>
#include <iomanip>
#include <thrust/sort.h>
#include <thrust/copy.h>
#include <thrust/random.h>
#include <thrust/unique.h>
#include <thrust/reduce.h>
#include <thrust/iterator/constant_iterator.h>

using namespace std;
template <typename Vector>
void print_vector(const std::string& name, const Vector& v)
{
  typedef typename Vector::value_type T;
  std::cout << "  " << std::setw(20) << name << "  ";
  thrust::copy(v.begin(), v.end(), std::ostream_iterator<T>(std::cout, ""));
  std::cout << std::endl;
}

int main()
{
thrust::device_vector<int> x;
x.push_back(1);
x.push_back(10);
x.push_back(1);
x.push_back(11);
x.push_back(1);
x.push_back(11);
thrust::device_vector<int> y(10);

print_vector("Original",x);

thrust::sort(x.begin(),x.end());
print_vector("sort",x);

thrust::device_vector<int>::iterator it=thrust::unique(x.begin(),x.end());
std::cout<<*it<<std::endl;

//int newsize=it-y.begin();
int newsize=thrust::distance(y.begin(),it);
cout<<"nsz:"<<newsize<<endl;

return 0;
}

Upvotes: 0

Views: 533

Answers (1)

Robert Crovella
Robert Crovella

Reputation: 152003

The iterator it is established with respect to the vector x:

thrust::device_vector<int>::iterator it=thrust::unique(x.begin(),x.end());
                                                       ^         ^

But you are asking for the distance from this iterator to the beginning of the vector y:

int newsize=thrust::distance(y.begin(),it);
                             ^

That doesn't make sense. There is no defined relationship between it and the vector y.

If you ask for the distance to the beginning of vector x instead, you'll get more sensible results:

$ cat t1244.cu
#include <thrust/device_vector.h>
#include <thrust/host_vector.h>
#include <thrust/reduce.h>
#include <thrust/extrema.h>
#include <iostream>
#include <iomanip>
#include <thrust/sort.h>
#include <thrust/copy.h>
#include <thrust/random.h>
#include <thrust/unique.h>
#include <thrust/reduce.h>
#include <thrust/iterator/constant_iterator.h>

using namespace std;
template <typename Vector>
void print_vector(const std::string& name, const Vector& v)
{
  typedef typename Vector::value_type T;
  std::cout << "  " << std::setw(20) << name << "  ";
  thrust::copy(v.begin(), v.end(), std::ostream_iterator<T>(std::cout, " "));
  std::cout << std::endl;
}

int main()
{
thrust::device_vector<int> x;
x.push_back(1);
x.push_back(10);
x.push_back(1);
x.push_back(11);
x.push_back(1);
x.push_back(11);
thrust::device_vector<int> y(10);

print_vector("Original",x);

thrust::sort(x.begin(),x.end());
print_vector("sort",x);

thrust::device_vector<int>::iterator it=thrust::unique(x.begin(),x.end());
std::cout<<*it<<std::endl;

//int newsize=it-y.begin();
int newsize=thrust::distance(x.begin(),it);
cout<<"nsz:"<<newsize<<endl;

return 0;
}
$ nvcc -o t1244 t1244.cu
$ ./t1244
              Original  1 10 1 11 1 11
                  sort  1 1 1 10 11 11
10
nsz:3
$

Upvotes: 1

Related Questions