Thrust库从C++的STL中得到灵感,将最简单的类似于STL的结构放在Thrust库中,比如STL中的vector。此外,Thrust库还包含STL中的算法和迭代器。
        Thrust函数库提供了两个向量容器,分别为主机和设备提供了向量类并且分别驻留在主机和设备的全局内存中。向量可以使用数组下标进行读取或者修改。然而,如果向量在设备上,那么对于每个这样的访问,Thrust通过PCI-E总线在后台执行单独的传输,因此,将这样一个结构放在循环里不是一个好的主意。
        Thrust提供了大量的函数类型集合,包括:转换(transformation),规约(reduction),前缀求和(prefix sum),再排序(reordering),排序(sorting)。Thrust并不是传统意义上的函数库,因为它的所有内容都在所包含的头文件中。因此,要避免包含所有的文件。只要包含需要的头文件就行了。
        通过如下代码,我们可以创建对应的host_vector和device_vector向量对象:

C/C++ code

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <thrust/host_vector.h> 
#include <thrust/device_vector.h>
#include <iostream> 
 
int main(void) { 
    // H has storage for 4 integers 
    thrust::host_vector<int> H(4); 
    // initialize individual elements 
    H[0] = 14; 
    H[1] = 20; 
    H[2] = 38; 
    H[3] = 46; 
    // H.size() returns the size of vector H 
    std::cout << "H has size " << H.size() << std::endl; 
    // print contents of H 
    for(int i = 0; i < H.size(); i++) 
        std::cout << "H[" << i << "] = " << H[i] << std::endl; 
 
    // resize H 
    H.resize(2); 
    std::cout << "H now has size " << H.size() << std::endl; 
 
    // Copy host_vector H to device_vector D
    thrust::device_vector<int> D = H; 
    // elements of D can be modified
    D[0] = 99; 
    D[1] = 88; 
    // print contents of D 
    for(int i = 0; i < D.size(); i++) 
        std::cout << "D[" << i << "] = " << D[i] << std::endl; 
    // H and D are automatically deleted when the function returns 
    return 0; 
    

从代码中可以看出,声明一个host_vector和device_vector是很容易的,只要添上对应的头文件,并加上命名空间就可以了。Thrust的vector同C++ STL标准库中vector类似,可以动态改变大小。其它的一些操作可以参看官方文档。

        一旦数据在Thrust设备向量或主机向量容器中,我们就可以使用大量Thrust提供的标准函数。比如,Thrust提供了一个简单的排序函数,该函数只需要提供向量开头和结尾的索引。它把任务分配到不同的线程块上并且执行任何规约和线程间的通信操作。下面举个排序函数的例子:

C/C++ code

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <thrust/host_vector.h>
#include <thrust/device_vector.h>
#include <thrust/generate.h>
#include <thrust/sort.h>
#include <thrust/copy.h>
#include <cstdlib>
 
#define NUM_ELEM (1024 * 1024)
 
int main(void)
{
    thrust::host_vector<int> host_array(NUM_ELEM);
 
    thrust::generate(host_array.begin(), host_array.end(), rand);
    thrust::device_vector<int> device_array = host_array;
 
    thrust::sort(device_array.begin(), device_array.end());
    thrust::sort(host_array.begin(), host_array.end());
 
    thrust::host_vector<int> host_array_sorted = device_array;
    return 0;
}

【CUDA开发】Thrust库的更多相关文章

  1. 【ARM-Linux开发】【CUDA开发】【深度学习与神经网络】Jetson Tx2安装相关之三

    JetPack(Jetson SDK)是一个按需的一体化软件包,捆绑了NVIDIA®Jetson嵌入式平台的开发人员软件.JetPack 3.0包括对Jetson TX2 , Jetson TX1和J ...

  2. 【神经网络与深度学习】【CUDA开发】caffe-windows win32下的编译尝试

    [神经网络与深度学习][CUDA开发]caffe-windows win32下的编译尝试 标签:[神经网络与深度学习] [CUDA开发] 主要是在开发Qt的应用程序时,需要的是有一个使用的库文件也只是 ...

  3. 【神经网络与深度学习】【CUDA开发】【VS开发】Caffe+VS2013+CUDA7.5+cuDNN配置过程说明

    [神经网络与深度学习][CUDA开发][VS开发]Caffe+VS2013+CUDA7.5+cuDNN配置过程说明 标签:[Qt开发] 说明:这个工具在Windows上的配置真的是让我纠结万分,大部分 ...

  4. 【CUDA开发】CUDA从入门到精通

    CUDA从入门到精通(零):写在前面 在老板的要求下,本博主从2012年上高性能计算课程开始接触CUDA编程,随后将该技术应用到了实际项目中,使处理程序加速超过1K,可见基于图形显示器的并行计算对于追 ...

  5. 2015年10个最佳Web开发JavaScript库

    2015年10个最佳Web开发JavaScript库 现在的互联网可谓是无所不有,有大量的JavaScript项目开发工具充斥于网络中.我们可以参考网上的指导来获取构建代码项目的各种必要信息.如果你是 ...

  6. iOS开发--开源库

    图像: 1.图片浏览控件MWPhotoBrowser        实现了一个照片浏览器类似 iOS 自带的相册应用,可显示来自手机的图片或者是网络图片,可自动从网络下载图片并进行缓存.可对图片进行缩 ...

  7. 移动开发UI库

    参考链接:http://www.cnblogs.com/edobnet/archive/2012/08/17/2643573.html 自己总结: jquery 的移动开发UI库  http://jq ...

  8. Windows平台CUDA开发之前的准备工作

    CUDA是NVIDIA的GPU开发工具,眼下在大规模并行计算领域有着广泛应用. windows平台上面的CUDA开发之前.最好去NVIDIA官网查看说明,然后下载对应的driver. ToolKits ...

  9. 【CUDA开发】CUDA面内存拷贝用法总结

    [CUDA开发]CUDA面内存拷贝用法总结 标签(空格分隔): [CUDA开发] 主要是在调试CUDA硬解码并用D3D9或者D3D11显示的时候遇到了一些代码,如下所示: CUdeviceptr g_ ...

随机推荐

  1. 浅析BFC及其作用

    本文链接:https://blog.csdn.net/riddle1981/article/details/52126522

  2. mybatis insert into 返回id

    <insert id="saveComplaint" useGeneratedKeys="true" parameterType="com.fo ...

  3. sql 为空不做查询条件

    select * from usertable where 1=1 and (name=@name or @name='') and (page=@page or @page='')

  4. learning armbian steps(10) ----- armbian 源码分析(五)

    在上一节的分析当中,已经知道了uboot kernel的源代码路径及编译选项,以及rootfs的版本,相关信息如下所示: ## BUILD CONFIGURATION Build target: Bo ...

  5. TensorFlow使用记录 (十): Pretraining

    上一篇的模型保存和恢复熟练后,我们就可以大量使用 pretrain model 来训练任务了 Tweaking, Dropping, or Replacing the Upper Layers The ...

  6. linux 动态库文件stripped属性理解

    [file命令not stripped] UNIX下*.o和*.so文件显示的stripped和not stripped是什么意思? 表示符号表是否被清除. 在centos 6.2下用file命令查看 ...

  7. MySQL_(Java)分页查询MySQL中的数据

    MySQL_(Java)使用JDBC向数据库发起查询请求 传送门 MySQL_(Java)使用JDBC创建用户名和密码校验查询方法 传送门 MySQL_(Java)使用preparestatement ...

  8. C++中void和void*指针的含义 (指针类型的含义)

    转载自:http://blog.csdn.net/lee_shuai 指针有两个属性:指向变量/对象的地址和长度,但是指针只存储地址,长度则取决于指针的类型:编译器根据指针的类型从指针指向的地址向后寻 ...

  9. 回调函数(callback) python / c++ 演示

    什么是回调函数? 我们绕点远路来回答这个问题. 编程分为两类:系统编程(system programming)和应用编程(application programming).所谓系统编程,简单来说,就是 ...

  10. Oracle 表空间扩容

    1 系统表空间扩容 注:表空间监测或扩容方式很多,这里只提供一种方便使用的方法 1)查询SQL 注:需要输入百分比,如:90,就可查出使用率超过90%的表空间, with t as (select b ...