我在工作中使用 Thrust 来完成一些任务,并发现在构造
zip_iterator
时似乎存在最大数量的迭代器。
例如
#include <thrust/iterator/zip_iterator.h>
#include <thrust/device_vector.h>
int main() {
thrust::device_vector<int> A(10),B(10),C(10);
auto zitor = thrust::make_zip_iterator(A.begin(),A.begin(),
B.begin(),B.begin(),
B.begin(),B.begin(),
B.begin(),B.begin(),
C.begin(),C.begin());
}
这段代码编译成功。但是如果我在初始化列表中再添加一个迭代器,就会出现错误:
multizip.cu(8): error: no instance of overloaded function "thrust::make_zip_iterator" matches the argument list
argument types are: (thrust::detail::normal_iterator<thrust::device_ptr<int>>, thrust::detail::normal_iterator<thrust::device_ptr<int>>, thrust::detail::normal_iterator<thrust::device_ptr<int>>, thrust::detail::normal_iterator<thrust::device_ptr<int>>, thrust::detail::normal_iterator<thrust::device_ptr<int>>, thrust::detail::normal_iterator<thrust::device_ptr<int>>, thrust::detail::normal_iterator<thrust::device_ptr<int>>, thrust::detail::normal_iterator<thrust::device_ptr<int>>, thrust::detail::normal_iterator<thrust::device_ptr<int>>, thrust::detail::normal_iterator<thrust::device_ptr<int>>, thrust::detail::normal_iterator<thrust::device_ptr<int>>)
1 error detected in the compilation of "multizip.cu".
它最多接受十个迭代器,还是我误解了什么?如果是这样,有什么解决方法吗?
using Itor = thrust::device_vector<int>::iterator;
using Zitor = thrust::zip_iterator<thrust::tuple<
Itor,Itor,Itor,Itor,Itor,Itor,
Itor,Itor,Itor,Itor,Itor>>;
这段代码也不起作用,除非我删除一个
Itor
,错误信息是:
multizip.cu(17): error: too many arguments for class template "thrust::tuple"
所以我相信thrust::tuple中的迭代器数量确实有最大限制为10。我可以克服这个限制吗?
迭代器的数量在编译时由模板类型决定。这就是您收到最后一个错误的原因。我认为编译器对您创建的迭代器数量存在问题。这称为重载函数(因此第一个错误说“没有重载函数的实例”)。
我可能建议您首先尝试使用两个函数,将迭代器创建分成两个独特的函数,看看这是否是问题所在。
请参阅此处:https://forums.developer.nvidia.com/t/thrust-zip-iterator-with-任意-number-of-iterators/292942。 https://forums.developer.nvidia.com/t/combining-thrust-zip-iterator-transform-iterator-counting-iterator-for-modified-summed-area-table/56154.