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. Hadoop-No.1之数据存储选型

    文件格式 Hadoop支持多种面向数据存储的文件格式,包括纯文本和Hadoop特有的格式,如SequenceFile.还有一些更加复杂但功能更加丰富的格式可供选择,如Avro与Parquet.不同的格 ...

  2. Mybatis Generator-自动化生成代码步骤

    链接:https://blog.csdn.net/guo_xl/article/details/86004068 文档:http://mybatis.org/generator/configrefer ...

  3. ORA-03113:通信通道的文件结尾处理

     ORA-03113:通信通道的文件结尾执行:alter system set "_optimizer_join_elimination_enabled"=false; cmdsq ...

  4. keras手写数字识别

    import kerasimport timefrom keras.utils import np_utils start = time.time()(x_train, y_train), (x_te ...

  5. prop(name|properties|key,value|fn)

    prop(name|properties|key,value|fn) 概述 获取在匹配的元素集中的第一个元素的属性值.直线电机选型 随着一些内置属性的DOM元素或window对象,如果试图将删除该属性 ...

  6. jquery clearQueue方法 语法

    jquery clearQueue方法 语法 作用:clearQueue() 方法停止队列中所有仍未执行的函数.与 stop() 方法不同,(只适用于动画),clearQueue() 能够清除任何排队 ...

  7. Vue3.0+TypeScript

    序言 资料 https://www.cnblogs.com/chanwahfung/p/11968205.html

  8. java 项目 文件关系 扫描 注释注入(2)

    https://www.cnblogs.com/daimajun/p/7152970.html(copy) 先提一嘴 @RequestMapping(“url”),这里的 url写的是请求路径的一部分 ...

  9. 线性素数筛(欧拉筛)(超级好的MuBan)

    Problem:找出小于等于n的所有素数的个数. #include <bits/stdc++.h> using namespace std; const int maxn = 1e6; i ...

  10. 推荐系统系列(四):PNN理论与实践

    背景 上一篇文章介绍了FNN [2],在FM的基础上引入了DNN对特征进行高阶组合提高模型表现.但FNN并不是完美的,针对FNN的缺点上交与UCL于2016年联合提出一种新的改进模型PNN(Produ ...