从CUDA中的device_ptr获取reverse_iterator

时间:2014-11-04 08:51:24

标签: cuda thrust

对于device_vector,我可以使用其rbegin()方法来获取其反向迭代器。但是如何直接从device_ptr构建反向迭代器?

可以通过使用device_ptr构造device_vector来实现,代码如下:

thrust::device_ptr<int> ptr = get_ptr();
thrust::device_vector<int> tmpVector(ptr , ptr + N)
thrust::inclusive_scan_by_key(tmpVector.rbegin(), tmpVector.rend(), ......);

但是我不知道thrust::device_vector<int> tmpVector(ptr , ptr + N)是否会构造一个新的向量并从ptr复制数据,或者只是保留ptr的引用? Thrust的文档并没有提到这一点。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

根据Jared的评论提供答案,将其从未答复的清单中删除,并为未来的读者保留问题。

要从任何类型的迭代器(包括thrust::device_ptr)制作reverse iterator,请使用thrust::make_reverse_iterator function

这是一个简单的例子:

$ cat t615.cu
#include <thrust/device_vector.h>
#include <thrust/iterator/reverse_iterator.h>
#include <thrust/device_ptr.h>
#include <thrust/sequence.h>
#include <thrust/copy.h>
#include <iostream>
#define DSIZE 4
int main(){

  int *data;
  cudaMalloc(&data, DSIZE*sizeof(int));
  thrust::device_ptr<int> my_data = thrust::device_pointer_cast<int>(data);
  thrust::sequence(my_data, my_data+DSIZE);
  thrust::copy_n(my_data, DSIZE, std::ostream_iterator<int>(std::cout, ","));
  std::cout << std::endl;
  typedef thrust::device_vector<int>::iterator Iterator;     
  thrust::reverse_iterator<Iterator> r_iter = make_reverse_iterator(my_data+DSIZE); // note that we point the iterator to the "end" of the device pointer area
  thrust::copy_n(r_iter, DSIZE, std::ostream_iterator<int>(std::cout, ","));
  std::cout << std::endl;
  return 0;
}
$ nvcc -arch=sm_35 -o t615 t615.cu
$ ./t615
0,1,2,3,
3,2,1,0,
$

创建反向迭代器不会创建任何&#34;额外数组&#34;。