【NVIDIA CUDA】2023 CUDA夏令营编程模型(四)

news2024/9/24 9:27:34

博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持!
博主链接

本人就职于国际知名终端厂商,负责modem芯片研发。
在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。


博客内容主要围绕:
       5G/6G协议讲解
       算力网络讲解(云计算,边缘计算,端计算)
       高级C语言讲解
       Rust语言讲解

文章目录

  • CUDA流
    • CUDA流的概念
    • CUDA流的分类
    • CUDA流的创建和销毁
    • 使用CUDA加速程序
  • CUDA加速库
    • CUDA加速库的使用方法
    • 1. cuBLAS
      • cuBLAS context
      • Thread Safety
      • Results reproducibility
      • Parallelism with Streams
      • Cache configuration
    • 2.Thrust
    • 3.CV-CUDA
    • 4. NVIDIA cuNumeric
    • 5.NVIDIA TensorRT



CUDA流

CUDA流的概念

  • CUDA流在加速应用程序方面起到重要的作用,他表示一个GPU的操作队列,操作在队列中按照一定的顺序执行,也可以向流中添加一定的操作如核函数的启动、内存的复制、事件的启动和结束等,添加的顺序也就是执行的顺序;
  • 一个流中的不同操作有着严格的顺序。但是不同流之间是没有任何限制的。多个流同时启动多个内核,就形成了网格级别的并行;
  • CUDA流中排队的操作和主机都是异步的,所以排队的过程中并不耽误主机运行其他指令,所以这就隐藏了执行这些操作的开销

在这里插入图片描述
通过流可以实现:

  • 重叠主机和设备计算
  • 重叠主机计算和主机设备数据传输
  • 重叠主机设备数据传输和设备计算
  • 并发设备计算(多个设备)

但是无法实现:

  • page-locked 主机内存的分配;
  • 设备内存的分配;
  • 将两个不同地址的数据传输到相同的设备地址;
    • 任何对NULL stream的CUDA命令;

CUDA流的分类

  • NULL stream:隐式分配的流;
  • non-NULL stream:显示分配的流;

CUDA流的创建和销毁

// 定义一个流
cudaStream_t a;

// 创建一个流
cudaError_t cudaStreamCreate(cudaStream_t* pStream);

// 绑定一个流,指示在哪个流里面进行一个异步的数据传输
cudaError_t cudaMemcpyAsync(void* dst, const void* src, size_t count,cudaMemcpyKind kind, cudaStream_t stream = a);

// 指定核函数在哪个流上执行
kernel_name<<<grid, block, sharedMemSize, stream>>>(argument list);

// 销毁一个流
cudaError_t cudaStreamDestroy(cudaStream_t stream);

在这里插入图片描述

使用CUDA加速程序

例如,一个向量求和 A+B = C
在这里插入图片描述
默认在NULL stream中所有操作都是串行的,通过使用多个流,将一个串行的操作并行化,可以看到上面使用了4个流,将向量求和分成了4个并行操作来执行,可以将运算速度提升4倍。

CUDA加速库

CUDA加速库的使用方法

  1. 创建一个库相关的handle,用于管理库相关操作的上下文信息;
  2. 为库函数的输入输出分配设备内存;
  3. 如果输入的数据格式不是CUDA库支持的格式,需要对数据格式进行转换;
  4. 使用支持的数据格式,初始化预分配的设备内存;
  5. 配置库计算的详细参数;
  6. 执行库计算,将计算卸载到GPU;
  7. 从设备内存获取计算结果;
  8. 可能涉及结果数据格式的转换;
  9. 释放CUDA资源;
  10. 继续执行程序剩余的操作;

1. cuBLAS

cuBLAS库是基于CUDA运行时的BLAS(Basic Linear Algebra Subprograms)实现的,cuBLAS库用于进行向量/矩阵运算,它包含两套API:

  • cuBLAS API,需要用户自己分配GPU内存空间,按照规定格式填入数据;
  • cuBLASXT API,可以分配数据在CPU端,然后调用函数,它会自动管理内存、执行计算;

Pyculib是一个包,它提供对几个数值库的访问,这些数值库针对NVidia GPU的性能进行了优化。

cuBLAS context

  • 应用程序必须通过调用cublasCreate()函数初始化cuBLAS库上下文的句柄;
  • 这种方法允许用户在使用多个主机线程和多个GPU时显式控制库设置;

Thread Safety

  • 这个库是线程安全的,它的函数可以从多个主机线程调用,即使使用相同的句柄;
  • 当多个线程共享同一个句柄时,在更改句柄配置时需要格外小心,因为该更改可能会影响所有线程中后续的CUBLAS调用;
  • 因此,不建议多个线程共享相同的CUBLAS handle;

Results reproducibility

  • 按照设计,来自给定工具包版本的所有CUBLAS API例程在每次运行时在具有相同架构和相同SMs数量的gpu上执行时都生成相同的位结果;
  • 然而,由于实现可能会因一些实现更改而有所不同,因此不能保证跨工具包版本的逐位重现性;

Parallelism with Streams

  • 如果应用程序使用多个独立任务计算的结果,则可以使用CUDA streams来重叠这些任务中执行的计算;
    cudaStreamCreate()
    cublasSetStream()

Cache configuration

在某些设备上,L1缓存和共享内存使用相同的硬件资源。可以使用CUDA运行时函数cudaDeviceSetCacheConfig直接设置缓存配置。还可以使用例程cudaFuncSetCacheConfig为某些函数专门设置缓存配置。

2.Thrust

Thrust是基于标准模板库(STL)的CUDA的C++模板库。Thrust允许您通过与CUDA C完全互操作的高级接口,以最少的编程工作实现高性能并行应用程序。Thrust提供了丰富的数据并行原语集合,例如扫描、排序和规约,它们可以组合在一起,以简洁、可读的源代码实现复杂的算法。通过用这些高级抽象描述您的计算,您可以让Thrust自由地自动选择最有效的实现。因此,Thrust可用于CUDA应用程序的快速原型设计(其中程序员的生产力最为重要),也可用于生产。

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

int main(void)
{
	// generate 32M random numbers on the host
	thrust::host_vector<int> h_vec(32 << 20);
	thrust::generate(h_vec.begin(), h_vec.end(), rand);
	// transfer data to the device
	thrust::device_vector<int> d_vec = h_vec;
	// sort data on the device
	thrust::sort(d_vec.begin(), d_vec.end());
	// transfer data back to host
	thrust::copy(d_vec.begin(), d_vec.end(), h_vec.begin());
	return 0;
}

3.CV-CUDA

CV-CUDA 是一个开源项目,使开发人员能够在云规模的人工智能 (AI) 成像和计算机视觉 (CV)工作负载中构建高效、GPU 加速的预处理和后处理管道。借助一组针对数据中心 GPU 性能进行手动优化的专用 CV 和图像处理内核,CV-CUDA 可确保使用这些内核构建的处理管道得到执行,从而在整个复杂工作负载中提供更高的吞吐量。CV-CUDA 可以提供超过 10 倍的吞吐量改进和更低的云计算成本。 CV-CUDA 将提供与 C/C++、Python 的轻松集成,以及与 PyTorch 等常见深度学习 (DL) 框架的接口。

4. NVIDIA cuNumeric

将 GPU 加速的超级计算引入 NumPy 生态系统Python 已成为数据科学、机器学习和高效数值计算中使
用最广泛的语言。NumPy 是事实上的标准数学和矩阵库,提供简单易用的编程模型,其接口与科学应用的数学需求密切相关,使其成为许多最广泛使用的数据科学和机器学习的基础 构建学习编程环境。随着数据集规模的不断扩大和程序的复杂性不断增加,越来越需要通过利用远远超出单个 CPU 节点所能提供的计算资源来解决这些问题。

5.NVIDIA TensorRT

高性能深度学习推理SDK。



在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1014462.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

性能测试结果评估与展示

面向性能测试部门 对测试资产进行集中管理以及从项目或系统维度进行汇总展示是两种行之有效的管理手段。这些测试资产包括脚本、缺陷描述、测试记录、测试报告、项目需求等资料,通过对这些资料进行分类,当原有人员缺失的情况下,新接手的测试工程师能快速了解关键信息。 使…

Android RecyclerView BaseSectionQuickAdapter实现分组功能

详情网站&#xff1a;手把手教你使用BaseSectionQuickAdapter实现分组功能&#xff0c;史上最详细Adapter使用教程_basequickadapter 分组_杨阿程的博客-CSDN博客 //加入二个包implementation com.android.support:recyclerview-v7:26.0.0-beta1implementation com.github.Cym…

SAP 选择屏幕动态通过Radio Button 显示与隐藏以及控制是否必输

如何在选择屏幕上进行动态展示屏幕字段&#xff0c;并且进行必输项检查控制 1. 选择屏幕定义 SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.SELECTION-SCREEN BEGIN OF LINE.PARAMETERS: p_r1 TYPE c RADIOBUTTON GROUP grp USER-COMMAND uc DEFAULT X. &q…

【推荐】赴日IT课程 做赴日IT我该学什么?

许多想要做赴日IT的朋友问我说&#xff0c;我都该准备什么&#xff0c;或者我该学些什么才能达到可以做赴日程序员的水平呢&#xff1f;今天我就来跟大家聊一下这个问题。要说做准备&#xff0c;你需要有全日制大专及以上的学历才能获得赴日的资格&#xff0c;如果没有我们就先…

【Linux】线程的概念

文章目录 &#x1f4d6; 前言1. 线程的引入1.1 执行流&#xff1a;1.2 线程的创建&#xff1a;1.3 线程的等待&#xff1a; 2. 查看线程2.1 链接线程库&#xff1a;2.2 ps -aL&#xff1a; 3. 页表的认识3.1 二级页表&#xff1a;3.2 页表的实际大小&#xff1a; 4. 再看线程4.…

全面深入理解TCP协议(超详细)

目录 前言 TCP协议格式 确认应答机制(ACK) 理解可靠性 确认应答的机制 16位窗口大小 缓冲区 流量控制 6个标志位 16位紧急指针 ★三次握手&#xff0c;四次挥手 如何理解连接 如何理解三次握手 如何理解四次挥手 TCP可靠性机制 确认应答机制(补充) ​编辑…

70、Spring Data JPA 的 自定义查询(全手动,自己写完整 SQL 语句)

1、方法名关键字查询&#xff08;全自动&#xff0c;既不需要提供sql语句&#xff0c;也不需要提供方法体&#xff09; 2、Query查询&#xff08;半自动&#xff1a;提供 SQL 或 JPQL 查询&#xff09; 3、自定义查询&#xff08;全手动&#xff09; ★ 自定义查询&#xff08…

前端开发中,文本单行或多行溢出使用省略号显示

1.文本单行溢出使用省略号显示 关键代码如下&#xff1a; .box1{width: 200px;height: 30px;line-height: 30px;margin: 0 auto;background-color: rgba(220, 220, 220, 0.751);/* 单行文本超出隐藏 用省略号代替 */white-space: nowrap;overflow: hidden;text-overflow: ellip…

SpringMVC系列(七)之自定义注解

目录 一. Java注解简介 1.1 Java注解分类 1.2 JDK基本注解 Override Deprecated SuppressWarnings 1.3 JDK元注解 从 Java 7 开始&#xff0c;额外添加了 3 个注解: 1.4 自定义注解 如何自定义注解&#xff1f; 二. 自定义注解示例 枚举类&#xff1a; 示例一&…

Echarts 散点图的详细配置过程

文章目录 散点图 简介配置步骤简易示例 散点图 简介 Echarts散点图是一种常用的数据可视化图表类型&#xff0c;用于展示两个或多个维度的数据分布情况。散点图通过在坐标系中绘制数据点的位置来表示数据的关系。 Echarts散点图的特点如下&#xff1a; 二维数据展示&#xff…

JAVA成员变量首字母小写,第二个字母大写报错问题(原因:Lombok与Spring冲突)

1、问题现象&#xff1a; JAVA类里定义成员变量使用首字母小写&#xff0c;第二个字母大写 Getter Setter public class BrandQueryObject extends QueryObject{private String pName; }结果页面报错&#xff0c;无法找到类型为 cn.wolfcode.ssm.query.BrandQueryObject 的对象…

【Linux】常用工具(上)

Linux 常用工具 一、Linux 软件包管理器 yum1. 软件包2. 查看软件包3. 安装/卸载软件4. yum 其他指令的功能 二、Linux 编辑器 - vim 使用1. vim 的基本概念2. vim 的基本操作&#xff08;1&#xff09;光标移动&#xff08;命令模式&#xff09;&#xff08;2&#xff09;光标…

两届 TOKEN 2049 之间,孙宇晨和波场的布局与野心

2022 年在新加坡举办的 TOKEN 2049 大会上&#xff0c;波场TRON创始人、火币全球顾问委员会成员孙宇晨作为特邀嘉宾出席&#xff0c;并曾提出“波场 TRON 下一步的发展目标是成为主流金融机构”的生态愿景&#xff0c;揭示了波场生态的全新发展方向&#xff0c;以及孙宇晨作为区…

企业架构LNMP学习笔记49

Redis数据持久化操作&#xff1a; 数据、持久化&#xff08;数据在服务或者软件重启之后不丢失&#xff09;。 如果数据只存储在内存中&#xff0c;肯定会丢失&#xff0c;实现持久化&#xff0c;就需要把数据存储在磁盘中&#xff08;hdd ssd&#xff09;。 memcached在宕机…

Linux下生成可执行程序的每一步过程以及链接库的初步认识

程序的翻译 程序在形成可执行程序之前都经历过一系列十分复杂的过程&#xff0c;也就是我们程序的翻译&#xff0c;程序的翻译经过以下阶段&#xff1a; 预处理&#xff08;进行宏替换) 编译&#xff08;生成汇编) 汇编&#xff08;生成机器可识别代码&#xff09; 连接&#…

嵌入式C 语言中的三块技术难点

​ C 语言在嵌入式学习中是必备的知识&#xff0c;甚至大部分操作系统都要围绕 C 语言进行&#xff0c;而其中有三块技术难点&#xff0c;几乎是公认级别的“难啃的硬骨头”。 今天就来带你将这三块硬骨头细细拆解开来&#xff0c;一定让你看明白了。 0x01 指针 指针是公认…

Python 人工智能编程指南:基础、库和工具大全解析

Python 已成为人工智能 (AI) 和机器学习领域的通用语言。其广泛的应用、强大的库生态系统和用户友好的语法使其成为人工智能爱好者、数据科学家和研究人员的理想选择。在这份综合指南中&#xff0c;我们将探讨用于 AI 编程的 Python 基础知识&#xff0c;深入研究关键库&#x…

CKA真题分析-2023年度

补充信息 #补全 # apt install bash-completion source <(kubectl completion bash)# kubectl config get-contexts # cat ~/.kube/config |grep current# kubectl config current-context kubectl config use-context复制粘贴 ctrlshiftc ctrlshiftv # edit编辑时只能使…

ashx后台获取GET、POST、JSON方式提交的刷卡信息,并回应驱动读卡器显示文字播报语音

本示例使用设备&#xff1a; RFID网络WIFI无线TCP/UDP/HTTP可编程二次开发读卡器POE供电语音-淘宝网 (taobao.com) <% WebHandler Language"C#" Class"HttpReader" %>using System; using System.Web; using System.IO; using Newtonsoft.Json;publ…

Ubuntu 22.04.3 LTS安装

最近换电脑了&#xff0c;准备重新装一下ubuntu。多年前装过ubuntu很老的版本&#xff0c;现在发现官网最新的LTS版本是 Ubuntu 22.04.3 LTS 版本。那重新装的话&#xff0c;肯定装最新的版本了。这里我记录下自己的安装过程&#xff0c;作为以后的笔记查看。 我的环境&#x…