thrust快速入门指南(并行算法库,类似C++的STL)

2023-11-16

thrust快速入门指南

Introduction

  Thrust是基于标准模板库(STL)的并行平台的C ++模板库。Thrust允许您通过高级接口以最少的编程工作实现高性能并行应用程序,该接口可与C ++,CUDA,OpenMP和TBB等技术完全互操作。
  Thrust提供了丰富的数据并行原语集合,例如扫描,排序和缩减,它们可以组合在一起,通过简洁易读的源代码实现复杂的算法。通过根据这些高级抽象描述您的计算,您可以为Thrust提供自动选择最有效实现的自由。因此,Thrust可用于CUDA应用程序的快速原型设计,其中程序员生产力最重要,而且在生产中,稳健性和绝对性能至关重要。
  本文档描述了如何使用Thrust开发并行应用程序。即使您具有有限的C ++或并行编程经验,也可以访问本教程。

Prerequisites

  Thrust v1.6.0与CUDA 4.1(首选)和CUDA 4.0兼容。您可以通过nvcc --version在命令行上运行来确认已安装CUDA 。例如,在Linux系统上,

$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2011 NVIDIA Corporation
Built on Thu_Jan_12_14:41:45_PST_2012
Cuda compilation tools, release 4.1, V0.2.1221

  如果您使用的是CUDA 4.0或更高版本,那么您的系统上已经安装了Thrust,您可以安全地跳到下一部分。
  由于Thrust是一个C ++模板库,因此无需“构建”。只需从下载部分下载最新版本,然后将zip文件的内容解压缩到一个目录中。我们建议将Thrust安装到CUDA include目录中,这通常是
  /usr/local/cuda/include/ 在Linux和Mac OSX上
  C:\CUDA\include\ 在Windows系统上
如果您无法将Thrust安装到CUDA include目录,那么您可以将Thrust放在主目录中的某个位置,例如:/home/nathan/libraries/。
  警告:不要将Thrust安装到标准包含路径之类的/usr/local/include/。似乎nvcc对这些路径的处理方式不同于上面的建议,这会导致错误error: expected primary-expression before ‘<’ token.

Simple Example

  让我们用Thrust编译一个简单的程序,以确保满足所有先决条件。将以下源代码保存到名为的文件中version.cu

 #include <thrust/version.h>
 #include <iostream>
int main(void)
{
   
  int major = THRUST_MAJOR_VERSION;
  int minor = THRUST_MINOR_VERSION;

  std::cout << "Thrust v" << major << "." << minor << std::endl;

  return 0;
}

  现在编译version.cu带nvcc。如果将Thrust安装到CUDA include目录,那么以下命令应该可以正常工作。

$ ls
thrust  version.cu
$ nvcc version.cu -o version
$ ls
thrust  version version.cu
$ ./version
Thrust v1.6

  如果Thrust 目录放在其他地方,请使用该-I选项告知nvcc要查看的位置。例如,如果放入推力,/home/nathan/libraries/则应使用以下命令。

$ nvcc version.cu -o version -I /home/nathan/libraries/
Vectors

  Thrust提供两个矢量容器,host_vector和device_vector。顾名思义,host_vector存储在CPU的系统或“主机”内存中,同时device_vector存在于GPU的“设备”内存中。Thrust的向量容器就像std::vector在C ++标准库中一样。喜欢std::vector,host_vector并且device_vector是可以动态调整大小的通用容器(能够存储任何数据类型)。以下源代码说明了Thrust的向量容器的使用。

 #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 destroyed when the function returns
  return 0;
}

  如此示例所示,=操作员可用于将a复制host_vector到a device_vector(反之亦然)。该=运营商还可以用来复制host_vector到host_vector或device_vector到device_vector。另请注意,device_vector可以使用标准括号表示法访问a的各个元素。但是,因为这些访问中的每一个都需要调用cudaMemcpy,所以应该谨慎使用它们。稍后我们将介绍一些更有效的技术。
  将向量的所有元素初始化为特定值或仅将一组值从一个向量复制到另一个向量通常很有用。Thrust提供了一些方法来执行这些操作。

#include <thrust/host_vector.h>
#include <thrust/device_vector.h>

#include <thrust/copy.h>
#include <thrust/fill.h>
#include <thrust/sequence.h>

#include <iostream>

int main(void)
{
   
  // initialize all ten integers of a device_vector to 1
  thrust::device_vector<int> D(10, 1);

  // set the first seven elements of a vector to 9
  thrust::fill(D.begin(), D.begin() + 7, 9);

  // initialize a host_vector with the first five elements of D
  thrust::host_vector<int> H(D.begin(), D.begin() + 5);

  // set the elements of H to 0, 1, 2, 3, ...
  thrust::sequence(H.begin(), H.end());

  // copy all of H back to the beginning of D
  thrust::copy(H.begin(), H.end(), D.begin());

  // print D
  for(int i = 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

thrust快速入门指南(并行算法库,类似C++的STL) 的相关文章

  • Java 将前端传来的数字转化为日期

    由于不知名的原因 前端传来的日期数据被转换成了一串数字 导致入库失败 现需将数字转换为日期格式 代码如下 public class DateTest public static void main String args throws Pa
  • Linux touch 命令指南大全

    1 概述 在本教程中 我们将学习touch命令 简而言之 这个命令允许我们更新文件或目录的最后修改时间和最后访问时间 因此 我们将重点关注如何使用该命令及其各种选项 请注意 我们使用 Bash 测试了此处显示的所有命令 但是 它们应该与任何
  • 手把手教你二进制安装生产环境 K8s 多 master 节点高可用集群详细图文教程

    目录 一 集群环境准备 1 1 kubeadm 和二进制安装 k8s 适用场景分析 1 2 多 master 节点高可用架构图 二 基础环境配置 以下操作所有节点都得执 2 1 初步的环境初始化 2 2 关闭交换分区 swap 提升性能 2
  • Error:Abnormal build process termination: E:\myeclipse\jdk8\jdk\bin\java -Xmx700m -Djava.awt.headle

    解决办法 关闭电脑上面的防火墙就好了
  • Koin--适用于Kotlin的超好用依赖注入框架,Dagger替代者,Koin史上最详细解说,一篇就够了,妈妈再也不用担心我不会依赖注入了

    今年呆在家中实在无聊 外面太危险了 还是在家学习比较安全可持续 过年期间 我又复习了几遍依赖注入框架Dagger 诶 什么是依赖注入 说白了就是降低跟类对象之间的耦合 当需要修改类对象的时候 能不修改被依赖的实例 其实我们平常就用到了很多的
  • Flask的使用

    1 创建项目 利用python的包安装工具pip下载wheel pip3 install flask 查看当前项目的环境 pip3 list 1 2 项目构造 static templates app py mtv model templa
  • 网络中,ping命令还能这样玩

    在网络中 ping 是一个十分强大的 TCP IP 工具 它的作用主要为 1 用来检测网络的连通情况和分析网络速度 2 根据域名得到服务器 IP 3 根据 ping 返回的 TTL 值来判断对方所使用的操作系统及数据包经过路由器数量 一般情
  • Linux:PXE批量网络装机及kickstart无人值守安装

    目录 一 pxe简介 二 pxe使用的服务 三 实施过程 四 pxe优点 五 搭建PXE远程安装服务器 六 kickstart无人值守安装 一 pxe简介 PXE 预启动执行环境 是由Inter公司开发的网络引导技术 工作在Client S
  • 集成底座POC方案说明

    企业的信息化建设是伴随企业发展不断延伸 不断升级的过程 而随着信息化体量的不断增大 复杂繁多的业务系统往往又成为信息化建设的瓶颈 而为了消除瓶颈 更便捷的打通系统的关联 针对企业实际业务建立集成底座平台则是非常有效的一种方式 通过集成底座打
  • 【软件开发】MyBatis 理论篇

    MyBatis 理论篇 1 MyBatis 是什么 MyBatis 是一个半 ORM 对象关系映射 框架 它内部封装了 JDBC 开发时只需要关注 SQL 语句本身 不需要花费精力去处理加载驱动 创建连接 创建 statement 等繁杂的
  • 小程序通过子页面选择数据返回父页面更新数据

    问题 这是父页面 首先选择 地址栏默认地址 北京 按钮 进入子页面 这是子页面 这时候点击 其他城市 名称 将 城市 id 和 名称 更新到 父页面 解决方法 var pages getCurrentPages var currPage p
  • Linux小技巧2--git与GitHub学习笔记

    Linux小技巧2 git与GitHub学习笔记 近日学习了git与GitHub 内容是麦子学院老师关于git与GitHub的教程 话不多说先贴在此处以便于自己查看 也便于需要的人学习 后续将逐渐补充一些git常见错误处理相关的知识 1 g
  • 程序员35岁的破局之道

    微信公众号访问地址 程序员35岁的破局之道 近期热推文章 1 springBoot对接kafka 批量 并发 异步获取消息 并动态 批量插入库表 2 SpringBoot用线程池ThreadPoolTaskExecutor异步处理百万级数据
  • 详解java类的生命周期

    引言 最近有位细心的朋友在阅读笔者的文章时 对java类的生命周期问题有一些疑惑 笔者打开百度搜了一下相关的问题 看到网上的资料很少有把这个问题讲明白的 主要是因为目前国内java方面的教材大多只是告诉你 怎样做 但至于 为什么这样做 却不

随机推荐

  • Java如何比较两个日期的先后顺序

    在 Java 中 你可以使用 java util Date 或 java time LocalDate 类来比较两个日期的先后顺序 以下是使用 java util Date 类比较两个日期的先后顺序的示例代码 java import jav
  • 面对kafka频发的rebalance,该如何处理?

    Kafka 是我们最常用的消息队列 它那几万 甚至几十万的处理速度让我们为之欣喜若狂 但是随着使用场景的增加 我们遇到的问题也越来越多 其中一个经常遇到的问题就是 rebalance 重平衡 问题 但是要想了解 rebalance 那就得先
  • java+内存分配及变量存储位置的区别

    Java内存分配与管理是Java的核心技术之一 之前我们曾介绍过Java的内存管理与内存泄露以及Java垃圾回收方面的知识 今天我们再次深入Java核心 详细介绍一下Java在内存分配方面的知识 一般Java在内存分配时会涉及到以下区域 寄
  • Mysql常用的三种数据库引擎比较

    点击上方蓝字 快速关注 ISAM ISAM是一个定义明确且历经时间考验的数据表格管理方法 它在设计之时就考虑到数据库被查询的次数要远大于更新的次数 因此 ISAM执行读取操作的速度很快 而且不占用大量的内存和存储资源 ISAM的两个主要不足
  • ReplicaSet和ReplicationController区别

    ReplicaSet是新一代的ReplicationController ReplicaSet的pod标签选择器的表达能力更强 例如ReplicaSet能同时匹配两种标签 env dev和env pro ReplicationControl
  • ajax请求二进制数据

    var url var xhr new XMLHttpRequest xhr open GET url true 也可以使用POST方式 根据接口 xhr responseType blob 返回类型blob 定义请求完成的处理函数 请求前
  • 使用不同的渲染

    11
  • ubuntu更新源报错--软件包管理器apt在验证密钥时使用了旧的方式

    目录 一 解决报错一 二 解决报错二 一 解决报错一 1 报错原信息 Key is stored in Legacy trusted gpg keyring etc apt trusted gpg see the DEPRECATION S
  • 如何编辑加密的PDF

    在不知道密码的情况下如何编辑打印pdf呢 1使用WPS打开加密的pdf 2点击打印 神奇的事情 明明没有打印权限 选择打印为PDF 3获得一个新的有权限的PDF
  • vue3项目(六)---detail

    1 详情页 页面准备和路由配置 点击新鲜好物里的商品后 会跳转到详情页 并且会携带参数过去 1 先准备静态页面 在views下新建一个Detail组件 2 配置路由 src router index js import Detail fro
  • Python入门学习(三)核心语法(1)

    3 1Python序列详解 索引和引片 3 1Python序列详解 索引和引片 3 1 1 索引 list1 1 2 3 4 元素值 1 2 3 4 正索引 0 1 2 3 负索引 4 3 2 1 print list的第一个元素是 lis
  • 第一章_RabbitMQ简介

    MQ是什么 MQ Message Quene 翻译为 消息队列 通过典型的 生产者和消费者模型 生产者不断向消息队列中生产消息 消费者不断的从队列中获取消息 因为消息的生产和消费都是异步的 而且只关心消息的发送和接收 没有业务逻辑的侵入 轻
  • 出现找不到msvcp140.dll无法继续执行代码要怎么解决?

    出现找不到msvcp140 dll无法继续执行代码要怎么解决 当你尝试在Windows系统上运行某些程序或游戏时 可能会遇到 找不到msvcp140 dll无法继续执行代码 的错误提示 这个错误通常表示你的系统缺少了msvcp140 dll
  • centos7密码破解

    centos7密码破解 首先准备一台centos7系统 密码知道不知道都可以 1 先打开centos 然后进入选择系统的那一栏 然后点击任意键停住 按住e进入单用户模式 已经进入单用户模式 2 在Linux16最后面加上 目录rd brea
  • python操作Neo4j进行同名实体合并

    python操作Neo4j进行同名实体合并 使用python操作neo4j 3 5 4版本 时 防止已有节点重复创建 使用NodeMatcher函数 from py2neo import Graph Node Relationship No
  • 华为OD机试-计算网络信号

    华为OD机试 计算网络信号 网络信号经过传递会逐层衰减 且遇到阻隔物无法直接穿透 在此情况下需要计算某个位置的网络信号值 注意 网络信号可以绕过阻隔物 array m n 的二维数组代表网格地图 array i j 0代表i行j列是空旷位置
  • LeNet5的深入解析

    论文 Gradient based learning applied to document recognition 参考 http blog csdn net strint article details 44163869 LeNet5
  • Docker 使用国内镜像仓库

    Docker 使用国内镜像仓库 1 问题描述 2 总结 1 问题描述 由于某些原因 导致Docker镜像在国内下载速度特别慢 所以为了沉浸式开发 最好切换为国内源 这里以163 的镜像仓库举例 首先修改 etc docker daemon
  • 抓取得物数据出现验证码的解析思路

    原创来自本人的公众号 阿嚏个技术 公众号文章地址 得物采集数据出现geetest验证码的解析方式 本文仅提供反爬技术的分析思路 勿做商业用途 如有侵权 请联系删除 之前写过一篇爬得物数据的文章 毒 得物 APP历史购买数据抓取 阅读数还是挺
  • thrust快速入门指南(并行算法库,类似C++的STL)

    thrust快速入门指南 文章目录 thrust快速入门指南 Introduction Prerequisites Simple Example Vectors Thrust Namespace Iterators and Static D