Thrust快速入门教程(三)——迭代器与静态调度

2023-11-30 19:48

本文主要是介绍Thrust快速入门教程(三)——迭代器与静态调度,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

http://blog.csdn.net/dreampursue/article/details/6278752

在这节中我们曾使用了这样的表达式,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封装。例如:

[cpp]  view plain copy
  1. size_t N = 10;  
  2. // raw pointer to device memory  
  3. int * raw_ptr ;  
  4. cudaMalloc (( void **) & raw_ptr , N * sizeof ( int ));  
  5. // wrap raw pointer with a device_ptr  
  6. thrust :: device_ptr <int > dev_ptr ( raw_ptr );  
  7. // use device_ptr in thrust algorithms  
  8. thrust :: fill ( dev_ptr , dev_ptr + N, ( int ) 0);  
 

如需从 device_ptr中提取“原始”指针需要使用raw_pointer_cast,用法如下:

[cpp]  view plain copy
  1. size_t N = 10;  
  2. // create a device_ptr  
  3. thrust :: device_ptr <int > dev_ptr = thrust :: device_malloc <int >(N);  
  4. // extract raw pointer from device_ptr  
  5. int * raw_ptr = thrust :: raw_pointer_cast ( dev_ptr );  
 

迭代器另一个区别于指针的地方在于它可以遍历各种数据结构。例如,STL提供了链表容器(std::list),提供双向的(但不是随机访问)的迭代器。虽然Thrust不提供这类容器的设备端实现,但是与它们兼容。 

[cpp]  view plain copy
  1. # include <thrust / device_vector .h>  
  2. # include <thrust / copy .h>  
  3. # include <list >  
  4. # include <vector >  
  5. int main ( void )  
  6. {  
  7. // create an STL list with 4 values  
  8. std :: list <int > stl_list ;  
  9. stl_list . push_back (10) ;  
  10. stl_list . push_back (20) ;  
  11. stl_list . push_back (30) ;  
  12. stl_list . push_back (40) ;  
  13. // initialize a device_vector with the list  
  14. thrust :: device_vector <int > D( stl_list . begin () , stl_list . end ());  
  15. // copy a device_vector into an STL vector  
  16. std :: vector <int > stl_vector (D. size ());  
  17. thrust :: copy (D. begin () , D. end () , stl_vector . begin ());  
  18. return 0;  
  19. }  
 

 

 

备注:到目前为止,我们所讨论的是十分有用但相当基本的常用迭代器。除了这些常用迭代器,Thrust也提供了counting_iterator和zip_iterator这类特殊迭代器 。虽然他们看起来与常用迭代器一样,但是特殊迭代器能够提供更令人兴奋的特性。我们将在后面的教程讨论这个问题。

 

这篇关于Thrust快速入门教程(三)——迭代器与静态调度的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/438318

相关文章

电脑桌面文件删除了怎么找回来?别急,快速恢复攻略在此

在日常使用电脑的过程中,我们经常会遇到这样的情况:一不小心,桌面上的某个重要文件被删除了。这时,大多数人可能会感到惊慌失措,不知所措。 其实,不必过于担心,因为有很多方法可以帮助我们找回被删除的桌面文件。下面,就让我们一起来了解一下这些恢复桌面文件的方法吧。 一、使用撤销操作 如果我们刚刚删除了桌面上的文件,并且还没有进行其他操作,那么可以尝试使用撤销操作来恢复文件。在键盘上同时按下“C

搭建Kafka+zookeeper集群调度

前言 硬件环境 172.18.0.5        kafkazk1        Kafka+zookeeper                Kafka Broker集群 172.18.0.6        kafkazk2        Kafka+zookeeper                Kafka Broker集群 172.18.0.7        kafkazk3

hdu 4565 推倒公式+矩阵快速幂

题意 求下式的值: Sn=⌈ (a+b√)n⌉%m S_n = \lceil\ (a + \sqrt{b}) ^ n \rceil\% m 其中: 0<a,m<215 0< a, m < 2^{15} 0<b,n<231 0 < b, n < 2^{31} (a−1)2<b<a2 (a-1)^2< b < a^2 解析 令: An=(a+b√)n A_n = (a +

v0.dev快速开发

探索v0.dev:次世代开发者之利器 今之技艺日新月异,开发者之工具亦随之进步不辍。v0.dev者,新兴之开发者利器也,迅速引起众多开发者之瞩目。本文将引汝探究v0.dev之基本功能与优势,助汝速速上手,提升开发之效率。 何谓v0.dev? v0.dev者,现代化之开发者工具也,旨在简化并加速软件开发之过程。其集多种功能于一体,助开发者高效编写、测试及部署代码。无论汝为前端开发者、后端开发者

Thymeleaf:生成静态文件及异常处理java.lang.NoClassDefFoundError: ognl/PropertyAccessor

我们需要引入包: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>sp

迭代器模式iterator

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/iterator 不暴露集合底层表现形式 (列表、 栈和树等) 的情况下遍历集合中所有的元素

利用Django框架快速构建Web应用:从零到上线

随着互联网的发展,Web应用的需求日益增长,而Django作为一个高级的Python Web框架,以其强大的功能和灵活的架构,成为了众多开发者的选择。本文将指导你如何从零开始使用Django框架构建一个简单的Web应用,并将其部署到线上,让世界看到你的作品。 Django简介 Django是由Adrian Holovaty和Simon Willison于2005年开发的一个开源框架,旨在简

一种改进的red5集群方案的应用、基于Red5服务器集群负载均衡调度算法研究

转自: 一种改进的red5集群方案的应用: http://wenku.baidu.com/link?url=jYQ1wNwHVBqJ-5XCYq0PRligp6Y5q6BYXyISUsF56My8DP8dc9CZ4pZvpPz1abxJn8fojMrL0IyfmMHStpvkotqC1RWlRMGnzVL1X4IPOa_  基于Red5服务器集群负载均衡调度算法研究 http://ww

CentOs7上Mysql快速迁移脚本

因公司业务需要,对原来在/usr/local/mysql/data目录下的数据迁移到/data/local/mysql/mysqlData。 原因是系统盘太小,只有20G,几下就快满了。 参考过几篇文章,基于大神们的思路,我封装成了.sh脚本。 步骤如下: 1) 先修改好/etc/my.cnf,        ##[mysqld]       ##datadir=/data/loc

SAM2POINT:以zero-shot且快速的方式将任何 3D 视频分割为视频

摘要 我们介绍 SAM2POINT,这是一种采用 Segment Anything Model 2 (SAM 2) 进行零样本和快速 3D 分割的初步探索。 SAM2POINT 将任何 3D 数据解释为一系列多向视频,并利用 SAM 2 进行 3D 空间分割,无需进一步训练或 2D-3D 投影。 我们的框架支持各种提示类型,包括 3D 点、框和掩模,并且可以泛化到不同的场景,例如 3D 对象、室