衍生于推力框架的花式迭代器(thrust :: zip_iterator)

时间:2014-02-25 18:05:43

标签: c++ gpgpu thrust

从推力框架的一个奇特的迭代器派生出来的规范方法是什么?

我将3D点存储在数组结构中。现在我正在考虑从中获取blas矢量类型的便捷方法。我想出的是这样的事情:

namespace abc {
  typedef VERY_BASIC_LINEAR_ALGEBRA_VECTOR_CLASS_FOR_TESTING t_vector;
  typedef typename thrust::device_vector::iterator t_baseIterator;
  typedef typename thrust::tuple<t_baseIterator,t_baseIterator,t_baseIterator> t_iteratorTuple;
  typedef typename thrust::zip_iterator<t_iteratorTuple> t_zipIterator;

  struct custom_iterator: public t_zipIterator {
    custom_iterator(t_zipIterator zi): t_zipIterator(zi) {}
    t_vector getVector() {
      return t_vector(**this);
    }
    void setVector(const t_vector& v) {
      **this = (t_tuple)v;
    }
  };
}

这很有效。这意味着我可以执行类似it.getVector()(其中it是有效的custom_iterator)的操作,并将此custom_iterators传递给推力计算基元,例如transform_reduce。 我已经搜索了更多关于推力的文档并找到了thrust::iterator_adaptor。现在的问题是:是否应该使用iterator_adaptor?如果是这样,为什么?上面代码的优点和缺点是什么?使用iterator_adaptor

似乎相当夸张
#include <thrust/iterator/iterator_adaptor.h>
class custom_iterator: public thrust::iterator_adaptor<custom_iterator, t_zipIterator> {
    public:
    typedef thrust::iterator_adaptor<custom_iterator, t_zipIterator> super_t;

    custom_iterator(const t_zipIterator &zi) : super_t(zi) {}

    t_vector getVector() {
        return t_vector(**this);
    }
    void setVector(const t_vector& v) {
        **this = (t_tuple)v;
    }

    friend class thrust::iterator_core_access;
};

我不知道这是否有效,因为我没试过。

所以问题是:做这个的规范方式是什么?

与此相关的另一个问题是: thrust :: transform_reduce或thrust :: transform_iterator使用的仿函数必须接受给定迭代器的基础类型,而不是迭代器本身。所以上面的custom_iterator几乎没用。有没有办法在使用的函子的operator()成员函数中接受迭代器而不是解引用的迭代器?

你可能会问自己为什么我想要一个带有这个额外的getter和setter的派生迭代器,如上面的例子表明t_vector初始化了zip_iterator的底层元组。但这仅仅是一个例子,而且有一个更复杂的案例,其中上述概念将是一种非常方便的方式。

1 个答案:

答案 0 :(得分:-1)

由于我无法在thrust::zip_iteratorthrust::iterator_adaptor中找到虚拟析构函数,我认为从任何一个派生出来都是一个坏主意。