在这节中我们曾使用了这样的表达式,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 plaincopyprint?
  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);

size_t N = 10; // raw pointer to device memory int * raw_ptr ; cudaMalloc (( void **) & raw_ptr , N * sizeof ( int )); // wrap raw pointer with a device_ptr thrust :: device_ptr <int > dev_ptr ( raw_ptr ); // use device_ptr in thrust algorithms thrust :: fill ( dev_ptr , dev_ptr + N, ( int ) 0);

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

[cpp] view plaincopyprint?
  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 );

size_t N = 10; // create a device_ptr thrust :: device_ptr <int > dev_ptr = thrust :: device_malloc <int >(N); // extract raw pointer from device_ptr int * raw_ptr = thrust :: raw_pointer_cast ( dev_ptr );

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

[cpp] view plaincopyprint?
  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. }

# include <thrust / device_vector .h> # include <thrust / copy .h> # include <list > # include <vector > int main ( void ) { // create an STL list with 4 values std :: list <int > stl_list ; stl_list . push_back (10) ; stl_list . push_back (20) ; stl_list . push_back (30) ; stl_list . push_back (40) ; // initialize a device_vector with the list thrust :: device_vector <int > D( stl_list . begin () , stl_list . end ()); // copy a device_vector into an STL vector std :: vector <int > stl_vector (D. size ()); thrust :: copy (D. begin () , D. end () , stl_vector . begin ()); return 0; }

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

转载于:https://www.cnblogs.com/carekee/articles/2409503.html

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

  1. Thrust快速入门教程(一)——简介

    Thrust 是一个类似于STL的针对CUDA的C++模板库.Trust提供与CUDA C完全兼容的接口,可以使我们高效地编写高性能并行程序. Thrust提供了丰富的数据并行算法,例如scan.so ...

  2. Thrust快速入门教程(二)——Vector的使用

    http://blog.csdn.net/dreampursue/article/details/6278737 Trust 提供了两个vector容器:host_vector 与 device_ve ...

  3. Jmeter 快速入门教程(三-1) --添加响应断言(即loadrunner中所指的检查点)

    [版权所有: whoistester.com & jmeter.cf] 上一节课,我们创建了一个测试场景,并进行了少量vuser的负载测试. 有时候我们执行了测试,但是发现并不是所有事务都执行 ...

  4. 新手必备pr 2021快速入门教程「三」素材的导入与管理

    PR2021快速入门教程,学完之后,制作抖音视频,vlog,电影混剪,日常记录等不在话下!零基础,欢迎入坑! 本节内容 上节内容我们学习了新建项目以及软件首选项的一些基本设置,接下来我们就可以导入素材 ...

  5. 【MATLAB Image Processing Toolbox 入门教程三】快速入门之“在多光谱图像中寻找植被”

    [MATLAB Image Processing Toolbox 入门教程三] 本篇摘要 一.从多光谱图像文件导入彩色红外通道 二.构建近红外光谱散射图 三.计算植被系数并显示其定位 四.综合实例部分 ...

  6. sklearn快速入门教程:(三)机器学习的通用模式及实现方法

    一.从线性回归总结机器学习的通用模式 从上篇博客我们详细讲述了线性回归的实现方式.线性回归的调用方式实际上是sklearn的典型方式,在掌握这个方法之后我们继续进一步深入,探索其它的模型的使用. 回顾 ...

  7. Python3数据分析——NumPy快速入门教程(官网教程翻译)

    目录 一.基础篇 1.创建数组 2.打印数组 3.基本运算 4.通用函数(ufunc) 5.索引,切片和迭代 二.形状操作 1.更改数组的形状 2.组合(stack)不同的数组 3.将一个数组分割(s ...

  8. Python3快速入门(三)——Python3标准数据类型

    Python3快速入门(三)--Python3标准数据类型 一.Python3标准数据类型 Python3 中有六种标准数据类型: A.Number(数字) B.String(字符串) C.List( ...

  9. Apple Watch开发快速入门教程

     Apple Watch开发快速入门教程  试读下载地址:http://pan.baidu.com/s/1eQ8JdR0 介绍:苹果为Watch提供全新的开发框架WatchKit.本教程是国内第一本A ...

最新文章

  1. pymysql dataframe 写入sql
  2. php redis微信发红包,高阶篇二 使用Redis队列发送微信模版消息
  3. .Net Core及.Net Standard主要概念回顾
  4. class-感知机Perception
  5. ip变更 mysql无法启动_MySQL 重装MySQL后, mysql服务无法启动
  6. 【转】windows多线程CreateThread与_beginthreadex本质区别
  7. C++中的萃取机制(traits)
  8. WinForm 设置窗体启动位置在活动屏幕右下角
  9. c语言上机题库徐州工程学院,徐州工程学院 C语言上机实验报告.docx
  10. CentOS 7忘记root密码解决办法
  11. 详解对密码执行散列和 salt 运算方法
  12. 图像知识 太经典 膜拜
  13. MaxScript学习 | 创建石头
  14. 【技巧】谷歌Chrome浏览器清理缓存的两种方式
  15. Moto me525+ 刷机
  16. 用友NC 用户名登录设置步骤
  17. 去哪查阅ISO国际标准?
  18. 【九九乘法表】javascript做九九乘法表
  19. SAP MM物料主数据
  20. linux安装firefox

热门文章

  1. vue-cli教程(一)
  2. java 消息机制 ActiveMQ入门实例
  3. webView的属性
  4. 关于条件运算符 ?:的小程序
  5. Pidgin Portable 使用点滴
  6. Struts 声明式异常处理和个性化异常处理(转)
  7. OpenAI及DeepMind两团队令未来的AI机器更安全
  8. ASP.NET MVC4 传递Model到View
  9. debian 语言配置
  10. AD不能复制提示目标主要名称不正确