派生自推力框架的高级迭代器(推力::zip_iterator)
derive from a fancy iterator of the thrust framework (thrust::zip_iterator)
从推力框架的一个奇特迭代器派生的规范方法是什么?
我将三维点存储在阵列结构中。现在我在想一种方便的方法,从中获得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_iterator
和thrust::iterator_adaptor
中都找不到虚拟析构函数,我想从其中任何一个派生都是个坏主意。
- 捕获标准输出以压缩并使用 CTRL-C 中断会给出损坏的 zip 文件
- 将 2D 推力::d evice_vector 复矩阵传递给 CUDA 内核函数
- 使用 Poco::Zip 将文件附加到现有 zip 文件
- 无法在 Cocos2dx 中使用受密码保护的 zip 文件
- 使用推力根据索引更改某些元素的值
- 使用 Poco::zip 添加新目录始终给出异常
- 如何使用 Poco::ZIP 压缩/解压缩 zip 文件
- C++.SevenZip压缩为zip格式.ClassFactory无法提供请求的类
- 推力中的参数排序
- 使用 GPU 上的推力库进行排序
- cpp libcurl 在 HTTP post 调用中发送 zip 文件,而不使用 multipart\form-da
- 数组中每个段的推力 CUDA 计算索引
- 推力+提升代码编译错误
- 如何通过提升::iostream防止zip炸弹
- 有谁知道ziplib是否能够在不实际提取所有文件的情况下验证zip库
- 使用推力的 ODE 求解器的 CUDA 编程
- 推力::sort_by_key上的配置参数无效
- 如何在设备上运行推力::count_if?(库达)
- 如何格式化推力::复制(ostream_iterator).
- 使用 libzip 打开 zip 文件时遇到问题