本人 CUDA小白一枚,要是有什么不对,还望各位大佬指点。
本文及后面的几篇将分别从几个方面来大概阐述一下Thrust的一些接口。原来的网址在这里
5. Iterator
5.1 Fancy Iterators
// 常量指针
template <typename Value, typename Incrementable = use_default, typename System = use_default>
class thrust::constant_iterator;
// 指向一系列按顺序更改的值。此迭代器可用于创建填充序列的范围,而无需将其显式存储在内存中。使用counting_iterator可节省内存容量和带宽
template <typename Incrementable, typename System = use_default, typename Traversal = use_default, typename Difference = use_default>
class thrust::counting_iterator;
// discard_iterator是一个迭代器,它表示一种特殊的指针,该指针在取消引用时忽略写入它的值。此迭代器可用于忽略某些算法的输出,而不会浪费内存容量或带宽。discard_iterator也可用于计算算法输出的大小,这些输出可能先验地未知
template <typename System = use_default>
class thrust::discard_iterator;
// iterator_adaptor是一个迭代器,它改编现有类型的迭代器以创建新的迭代器类型。Thrust的大多数花哨迭代器都是通过从iterator_adaptor继承来定义的。虽然这些现有推力迭代器的组合通常足以表达所需的功能,但有时直接从iterator_adaptor派生起来会更直接。
template <typename Derived, typename Base, typename Value = use_default, typename System = use_default, typename Traversal = use_default, typename Reference = use_default, typename Difference = use_default>
class thrust::iterator_adaptor;
// iterator_facade是一个模板,它允许程序员定义一个具有符合标准的接口的新颖迭代器,Thrust可以使用该接口来推理算法。
template <typename Derived, typename Value, typename System, typename Traversal, typename Reference, typename Difference = std::ptrdiff_t>
class thrust::iterator_facade;
// iterator_core_access是用户迭代器类型从 thrust::iterator_adaptor 或 thrust::iterator_facade 必须是friend才能允许其访问其私有接口的类。
class thrust::iterator_core_access;
// permutation_iterator是一个迭代器,它表示指向给定范围的重新排序视图的指针。permutation_iterator是一个不精确的名字;重新排序的视图不必是严格的排列。此迭代器可用于将分散或聚集操作与其他算法融合。
template <typename ElementIterator, typename IndexIterator>
class thrust::permutation_iterator;
// reverse_iterator是一个迭代器,它表示指向给定范围的反向视图的指针。通过这种方式,reverse_iterator允许通过双向输入范围进行向后迭代。
template <typename BidirectionalIterator>
class thrust::reverse_iterator;
// transform_input_output_iterator是一种特殊的迭代器,它在读取或写入取消引用的值时应用转换函数。此迭代器对于对需要从另一个迭代器中的值进行序列化/反序列化的类型的操作算法非常有用,从而避免了在内存中具体化中间结果的需要。这还使转换函数能够与读取和写入transform_input_output_iterator的操作融合。
template <typename InputFunction, typename OutputFunction, typename Iterator>
class thrust::transform_input_output_iterator;
// transform_iterator是一个迭代器,它表示在通过函数转换后指向一系列值的指针。此迭代器可用于创建一个区域,该区域填充了将一个操作应用于另一个区域的结果,而无需将其显式存储在内存中或显式执行转换。使用transform_iterator通过将转换的执行推迟到需要该值来促进内核融合,同时节省内存容量和带宽。
template <class AdaptableUnaryFunction, class Iterator, class Reference = use_default, class Value = use_default>
class thrust::transform_iterator;
// transform_output_iterator是一种特殊的输出迭代器,它转换在取消引用时写入的值。此迭代器可用于转换算法的输出,而无需将中间结果显式存储在内存中并应用后续转换,从而避免浪费内存容量和带宽。
template <typename UnaryFunction, typename OutputIterator>
class thrust::transform_output_iterator;
// zip_iterator是一个迭代器,它表示指向一系列元组的指针,这些元组的元素本身取自输入迭代器的元组。此迭代器可用于创建结构的虚拟数组,同时实现与数组结构习语相同的性能和带宽。zip_iterator还提供了一种在多个范围内摊销同一操作执行的便捷方法,从而促进了内核融合。
template <typename IteratorTuple>
class thrust::zip_iterator;
// 创建constant_iterator
template <typename ValueT, typename IndexT>
__host__ __device__ constant_iterator< ValueT, IndexT >
thrust::make_constant_iterator(ValueT x, IndexT i = int());
// 创建constant_iterator
template <typename V>
__host__ __device__ constant_iterator< V >
thrust::make_constant_iterator(V x);
// 创建counting_iterator
template <typename Incrementable>
__host__ __device__ counting_iterator< Incrementable >
thrust::make_counting_iterator(Incrementable x);
// 创建discard_iterator
__host__ __device__ discard_iterator
thrust::make_discard_iterator(discard_iterator<>::difference_type i = discard_iterator<>::difference_type(0));
// 创建permutation_iterator
template <typename ElementIterator, typename IndexIterator>
__host__ __device__ permutation_iterator< ElementIterator, IndexIterator >
thrust::make_permutation_iterator(ElementIterator e,
IndexIterator i);
// 创建reverse_iterator
template <typename BidirectionalIterator>
__host__ __device__ reverse_iterator< BidirectionalIterator >
thrust::make_reverse_iterator(BidirectionalIterator x);
// 创建transform_input_output_iterator
template <typename InputFunction, typename OutputFunction, typename Iterator>
transform_input_output_iterator< InputFunction, OutputFunction, Iterator > __host__ __device__
thrust::make_transform_input_output_iterator(Iterator io,
InputFunction input_function,
OutputFunction output_function);
// 创建transform_iterator
template <class AdaptableUnaryFunction, class Iterator>
__host__ __device__ transform_iterator< AdaptableUnaryFunction, Iterator >
thrust::make_transform_iterator(Iterator it,
AdaptableUnaryFunction fun);
// 创建transform_output_iterator
template <typename UnaryFunction, typename OutputIterator>
transform_output_iterator< UnaryFunction, OutputIterator > __host__ __device__
thrust::make_transform_output_iterator(OutputIterator out,
UnaryFunction fun);
// 创建zip_iterato
template <typename... Iterators>
__host__ __device__ zip_iterator< thrust::tuple< Iterators... > >
thrust::make_zip_iterator(thrust::tuple< Iterators... > t);
// 创建zip_iterato
template <typename... Iterators>
__host__ __device__ zip_iterator< thrust::tuple< Iterators... > >
thrust::make_zip_iterator(Iterators... its);
5.2 Iterator Tags
PS: 这个暂时不是很明白是用来干啥的QAQ
// 空的类,a representation of the Input Device Iterator
struct thrust::input_device_iterator_tag;
// 空的类,a representation of the Output Device Iterator
struct thrust::output_device_iterator_tag;
// 空的类,a representation of the Forward Device Iterator
struct thrust::forward_device_iterator_tag;
// 空的类,a representation of the Bidirectional Device Iterator
struct thrust::bidirectional_device_iterator_tag;
// 空的类,a representation of the Random Access Device Iterator
struct thrust::random_access_device_iterator_tag;