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

相关文章

一文教你Python如何快速精准抓取网页数据

《一文教你Python如何快速精准抓取网页数据》这篇文章主要为大家详细介绍了如何利用Python实现快速精准抓取网页数据,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录1. 准备工作2. 基础爬虫实现3. 高级功能扩展3.1 抓取文章详情3.2 保存数据到文件4. 完整示例

快速修复一个Panic的Linux内核的技巧

《快速修复一个Panic的Linux内核的技巧》Linux系统中运行了不当的mkinitcpio操作导致内核文件不能正常工作,重启的时候,内核启动中止于Panic状态,该怎么解决这个问题呢?下面我们就... 感谢China编程(www.chinasem.cn)网友 鸢一雨音 的投稿写这篇文章是有原因的。为了配置完

Python利用ElementTree实现快速解析XML文件

《Python利用ElementTree实现快速解析XML文件》ElementTree是Python标准库的一部分,而且是Python标准库中用于解析和操作XML数据的模块,下面小编就来和大家详细讲讲... 目录一、XML文件解析到底有多重要二、ElementTree快速入门1. 加载XML的两种方式2.

Linux之计划任务和调度命令at/cron详解

《Linux之计划任务和调度命令at/cron详解》:本文主要介绍Linux之计划任务和调度命令at/cron的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux计划任务和调度命令at/cron一、计划任务二、命令{at}介绍三、命令语法及功能 :at

Python 迭代器和生成器概念及场景分析

《Python迭代器和生成器概念及场景分析》yield是Python中实现惰性计算和协程的核心工具,结合send()、throw()、close()等方法,能够构建高效、灵活的数据流和控制流模型,这... 目录迭代器的介绍自定义迭代器省略的迭代器生产器的介绍yield的普通用法yield的高级用法yidle

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

C++变换迭代器使用方法小结

《C++变换迭代器使用方法小结》本文主要介绍了C++变换迭代器使用方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、源码2、代码解析代码解析:transform_iterator1. transform_iterat

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

springboot security快速使用示例详解

《springbootsecurity快速使用示例详解》:本文主要介绍springbootsecurity快速使用示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录创www.chinasem.cn建spring boot项目生成脚手架配置依赖接口示例代码项目结构启用s

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时