在这节中我们曾使用了这样的表达式,H.begin() 、H.end()、D.begin() + 7。begin()与end()的返回值在C++中被称为迭代器。vector的迭代器类似于数组的指针,用于指向数组的某个元素。H.begin()是指向H容器中数组第一个元素的迭代器。类似,H.end()指向H容器中的最后一个元素。
虽然说迭代器类似于指针,但它有着更丰富的作用。可以注意到在使用thrust::fill的时候我们并不需要指明这是device_vector的迭代器。这些信息包含在了D.begin()的返回值的迭代器类型中,其类型不同于H.begin()的返回值。当Thrust中的函数调用时,将根据迭代器的类型选择使用主机端还是设备端的算法实现。因为主机/设备调度是在编译时解析,所以这一过程被称为被称为静态调度。请注意,这意味着运行时没有调度进程的开销。
你可能想知道当“原始”指针作为Thrust函数的参数会如何。和STL一样,Thrust允许这种用法,它会调度主机端算法。如果传入的指针是指向设备端内存的指针,那么在调用函数之前需要用thrust::device_ptr封装。例如:
如需从 device_ptr中提取“原始”指针需要使用raw_pointer_cast,用法如下:

这篇博客介绍了Thrust库中的迭代器概念,包括其与C++中指针的相似性和不同点。通过示例展示了如何使用begin()和end()获取迭代器,并解释了Thrust如何根据迭代器类型进行静态调度,选择主机或设备端算法。此外,还讨论了如何处理设备内存的原始指针,以及Thrust与STL容器的兼容性。
最低0.47元/天 解锁文章
6

被折叠的 条评论
为什么被折叠?



