派生自推力框架的高级迭代器(推力::zip_iterator)

derive from a fancy iterator of the thrust framework (thrust::zip_iterator)

本文关键字:推力 zip iterator 迭代器 框架 高级 派生      更新时间:2023-10-16

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

我将三维点存储在阵列结构中。现在我在想一种方便的方法,从中获得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_itelator传递给pushts计算原语,如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使用的函子必须接受给定迭代器的底层类型,而不是迭代器本身。所以,上面提到的customer_iterator几乎是无用的。有没有办法在所用函子的operator()成员函数中接受迭代器而不是取消引用的迭代器?

您可能会问自己,为什么我想要一个带有这些附加getter和setter的派生迭代器,因为上面的示例表明t_vector无论如何都是用zip_iterator的underlyg元组初始化的。但这只是一个例子,还有一个更复杂的例子,上面的概念将是一个非常方便的方法。

由于我在thrust::zip_iteratorthrust::iterator_adaptor中都找不到虚拟析构函数,我想从其中任何一个派生都是个坏主意。