CUDA并行架构

一、CUDA简介

CUDA(Compute Unified Device Architecture)是一种由NVIDIA推出的通用并行计算架构,该架构使GPU(Graphics Processing Unit)能够对复杂的计算问题做性能速度优化。

二、串并行模式

高性能计算的关键是利用多核处理器进行并行计算。

串行模式:将任务分成很多小任务,逐个依次进行。

串并行模式:利用多核处理器同时处理多个子任务(前提是这些子任务不需要相互依赖,比如线程1的计算任务不需要用到线程2的计算结果)。为了加快大任务的计算速度,可以把一些独立的模块分配到不同的处理器上进行同时计算(这就是并行),最后再将这些结果进行整合,完成一次任务计算。

拆分计算模块进行并行加速。强依赖计算采用串行。

CPU需要很强的通用性来处理各种不同的数据类型,比如整型、浮点数等,同时它又必须擅长处理逻辑判断所导致的大量分支跳转和中断处理,而GPU面对的则是类型高度统一的、相互无依赖的大规模数据和不需要被打断的纯净的计算环境。

CPU:擅长流程控制和逻辑处理,不规则数据结构,不可预测存储结构,单线程程序,分支密集型算法。
GPU:擅长数据并行计算,规则数据结构,可预测存储模式。

异构计算:不同体系结构的处理器相互协作完成计算任务。当GPU各个线程完成计算任务后,我们就将GPU计算的结果拷贝到CPU端,完成一次计算任务。

 其中蓝色表示串行部分,绿色表示并行部分。

三、GPU参数讲解

线程是程序执行的最基本单元,CUDA的并行计算就是通过成千上万个线程的并行执行来实现的。

CUDA的线程模型从小到大来总结为:

        1.Thread:线程,并行的基本单位
        2.Thread Block:线程块,互相合作的线程组,线程块有如下几个特点:
                (1)允许彼此同步
                (2)可以通过共享内存快速交换数据
                (3)以1维、2维或者三维组织
        3.Grid:一组线程块
                (1)以1维、2维组织
                (2)共享全局内存
        4.Kernel:在GPU上执行的核心程序,这个kernel函数是运行在某个Grid上的。
                (1)One kernel 对应 One Grid
                (2)每一个block和每一个thread都有自己的ID,我们可以通过相应的索引找到相应的线程块和线程。
                        a.threadIdx, blockIdx
                        b.Block ID:1D, 2D or 3D
                        c.Thread ID:1D, 2D or 3D

型号RTX 4090
核心代号AD102-300
架构Ada Lovelace
晶体管数目(亿)763
核心面积(mm2)608.5
制程工艺TSMC 4N NVIDIA定制工艺
GPCs11
TPCs64
SMs/CUs128
Tensor Cores512(第四代)
RT Cores128(第三代)
纹理单元512
光栅单元176
峰值纹理填充速度 (GT/s)    1290.2
L2缓存(kb)73728
有效显存速度/显存数据速率(Gbps)21
显存频率(MHz)10501
最大显存带宽 (GB/s)1008
发售时建议零售价12999
CUDA Cores/流处理器

16384

SP:最基本的处理单元,streaming processor
SM:多个SP加上其他的一些资源组成一个streaming multiprocessor,也叫GPU大核

Boost频率(MHz)2520
基础频率(MHz)2235
显存24GB
显存位宽(bit)384
支持 NVIDIA NVLink™ (SLI-Ready)
显示器接口3×DisplayPort
1×HDMI
多显示器4
插槽占用3 插槽
最高 GPU 温度 (℃)90
TDP/TGP/TBP (W)450
推荐电源(W)850
供电接口16-Pin
(含1个4×8-Pin转16针接口适配器)
PCIe接口PCIe 4.0×16

四、编程注意事项

在CUDA编程中,核函数(kernel functions)是设计来在GPU上并行执行的函数。当核函数被调用时,它的执行是分配给GPU上的多个CUDA核心(也称为流处理器或SPs)来并行处理的。这包括核函数内的所有操作,包括条件分支语句。

条件分支语句的执行

在CUDA核函数中,条件分支语句(如ifelseswitch等)是在GPU上执行的,而不是在CPU上。这意味着每个并行执行的线程(在CUDA中,线程通常组织成线程块(blocks)和网格(grids))都会独立地评估条件分支语句,并根据其自己的局部状态(如线程索引、数据值等)来决定执行哪个分支。

分支发散(Branch Divergence)

虽然条件分支语句是在GPU上执行的,但分支条件的不同结果(即不同线程执行不同的分支)可能导致所谓的“分支发散”(Branch Divergence)。当GPU上的多个线程在同一时间点上需要执行不同的代码路径时,就会发生分支发散。

分支发散会影响GPU的性能,因为GPU硬件通常设计来同时执行大量相同的指令(SIMD,单指令多数据)。当发生分支发散时,GPU必须处理不同的指令流,这可能会降低并行执行的效率。为了最小化分支发散的影响,开发者应当尽量设计算法和数据结构,使得条件分支的预测更加一致,或者通过重新组织代码来减少分支的复杂度。

五、CUDA并行化改造建议

假设算法模型包含了神经网络、控制语句(如if-else)以及串行迭代计算过程,可以通过如下的分析过程加速你的算法模型:

  1. 识别可并行化的部分
    • 首先,分析你的算法模型,确定哪些部分是可以并行化的。通常,神经网络的各层计算(如矩阵乘法、激活函数应用等)是高度可并行化的。
    • 控制语句(if-else)和串行迭代计算过程可能不那么容易并行化,但如果迭代内部的计算可以独立进行,或者可以通过某种方式重新组织以减少依赖关系,则仍然有可能实现部分并行化。
  2. 设计CUDA核函数
    • 为神经网络的每一层设计一个或多个CUDA核函数。这些核函数将负责在GPU上执行矩阵乘法、激活函数应用等计算任务。
    • 如果可能,尝试将控制语句和串行迭代计算过程融入到并行化的框架中。例如,如果迭代内部的计算是独立的,你可以考虑使用不同的线程来处理不同的迭代。
  3. 优化内存访问
    • 优化CUDA核函数中的内存访问模式,以减少全局内存的访问延迟和带宽限制。这通常涉及到合并内存访问、使用共享内存(如果适用)以及优化数据布局等策略。
    • 尽量避免在核函数内部进行不必要的内存分配和释放,因为这会导致额外的开销。
  4. 处理分支发散
    • 如果你的CUDA核函数中包含if-else语句,并且这些语句导致不同的线程执行不同的代码路径,那么可能会出现分支发散。尽量减少分支发散的影响,例如通过重新组织代码、使用位掩码或条件计算等技术来减少分支的复杂度。
  5. 并行和串行部分的协调
    • 如果你的算法模型中既包含并行部分也包含串行部分,你需要仔细设计这些部分的协调机制。这通常涉及到在CPU和GPU之间传输数据、同步线程以及管理计算流程等任务。
    • 使用CUDA的流(Streams)和事件(Events)等特性来优化并行和串行部分的执行顺序和效率。
  6. 性能测试和调优
    • 在GPU上实现你的算法模型后,进行性能测试以评估其加速效果。使用NVIDIA的Nsight Compute、Nsight Systems或CUDA Profiler等工具来分析和优化你的CUDA程序。
    • 根据测试结果调整并行策略、优化内存访问模式以及改进算法设计以提高执行效率。
  7. 性能测试和调优
    • Isaac Gym:NVIDIA的Isaac Gym是一个高效的并行仿真环境,可以在单个GPU上同时运行数千个环境实例。它特别适用于需要大规模并行采样的强化学习任务。(仿真环境的矩阵化改造)

六、一些运行案例说明

python中pytorch用法


PyTorch的Tensor操作和神经网络层是在GPU上通过调用CUDA库来并行执行的,但控制流(如循环、条件判断等)则是由Python解释器在CPU上处理的。这是因为PyTorch(和大多数Python库)的设计是基于高层次的抽象,它们隐藏了底层的CUDA编程细节,以便用户能够以更直观的方式编写代码。

对于一个算法模型,其中存在神经网络、控制语句if else以及串行迭代计算过程。在PyTorch中,使用torch.multiprocessing来创建多个进程,并将模型和数据移至GPU上时,处理方式会根据不同部分的性质而有所不同:

  1. 神经网络部分:神经网络的计算(即前向传播、反向传播和参数更新)会发生在指定的GPU上,前提是模型的Tensor和数据都已经被.to(device)(其中device是指向GPU的torch.device对象)正确地移动到了GPU上。PyTorch会自动管理这些计算,在GPU上执行时利用GPU的并行计算能力。

  2. 控制语句if else:这些控制语句是由Python的CPU执行的。在PyTorch的上下文中,控制语句用于控制模型的逻辑流程,如条件分支或循环。由于这些操作不涉及到大量的数值计算,因此它们不需要在GPU上执行。相反,Python解释器(在CPU上运行)会处理这些控制语句。

  3. 串行迭代计算过程:如果这里的“串行迭代计算过程”指的是在Python中编写的循环或迭代操作,那么这些操作也是由CPU执行的。这些迭代过程可能涉及对Tensor的操作,但只要这些Tensor在GPU上,那么涉及Tensor的数值计算(如加法、乘法等)就会被发送到GPU上执行。然而,迭代本身(即循环的迭代逻辑)是在CPU上由Python解释器控制的。

CudaC中
 

__global__ void vector_add(float* vec1, float* vec2, float* vecres, int length)
{
    int tid = threadIdx.x;
    int a=100;
    if(a>1000){
          if (tid < length) {
                  vecres[tid] = vec1[tid] + vec2[tid];
              }
      }
}

该代码的条件逻辑都是在GPU中执行的。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python 中的 typing 模块常见用法

typing 模块是 Python 提供的一个标准库&#xff0c;主要用于为函数、变量和类定义类型提示&#xff08;Type Hints&#xff09;&#xff0c;从而提高代码的可读性和类型安全性。虽然 Python 是动态类型语言&#xff0c;但通过 typing 模块&#xff0c;开发者可以明确指定变量和…

【2024研赛】【华为杯E题】2024 年研究生数学建模比赛思路、代码、论文助攻

思路将在名片下群聊分享 高速公路应急车道紧急启用模型 高速公路拥堵现象的原因众多&#xff0c;除了交通事故外&#xff0c;最典型的就是部分路段出现瓶颈现象&#xff0c;主要原因是车辆汇聚&#xff0c;而拥堵后又容易蔓延。高速公路一些特定的路段容易形成堵点&#xff0…

Scrapy爬虫实战——某瓣250

# 按照我个人的习惯&#xff0c;在一些需要较多的包作为基础支撑的项目里&#xff0c;习惯使用虚拟环境&#xff0c;因为这样能极大程度的减少出现依赖冲突的问题。依赖冲突就比如A、B、C三个库&#xff0c;A和B同时依赖于C&#xff0c;但是A需要的C库版本大于N&#xff0c;而B…

一文说清楚ETL与Kafka如何实现集成

ETL与Kafka为何需要集成? 随着企业对实时流数据的处理要求越来越高&#xff0c;很多企业都把实时流数(日志、实时CDC采集数据、设备数据…)先推入到kafka中&#xff0c;再通过ETL对kafka中的数据进行消费通过ETL强大的数据的转换、清洗功能来进行数据的集成与分发。 实时数据…

CefSharp_Vue交互(Element UI)_WinFormWeb应用---设置应用透明度(含示例代码)

一、界面预览 1.1 设置透明(整个页面透明80%示例) 限制输入值:10-100(数字太小会不好看见) 1.2 vue标题栏 //注册类与js调用 (async function(

11年计算机考研408-数据结构

设执行了k次。 解析&#xff1a; d要第一个出&#xff0c;那么abc先入栈&#xff0c;d入栈然后再出栈&#xff0c;这前面是一个固定的流程&#xff0c;后面就很灵活了&#xff0c;可以ecba&#xff0c;ceba&#xff0c;cbea&#xff0c;cbae。 答案是4个序列。 解析&#xff1a…

CSS 复合选择器简单学习

目录 1. Emmet 语法 1.1 快速生成 HTML 结构语法 1.2 快速生成 CSS 样式 1.3 格式化工具 2. 调试 2.1 打开调试工具 2.2 使用调试工具 3. 复合选择器 3.1 后代选择器 3.2 子选择器 3.3 并集选择器 3.4 伪类选择器 3.3.1 链接伪类选择器 3.3.2 :focus 伪类选择器 …

OpenCV特征检测(5)检测图像中的角点函数cornerMinEigenVal()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 计算用于角点检测的梯度矩阵的最小特征值。 该函数类似于 cornerEigenValsAndVecs&#xff0c;但它计算并存储协方差矩阵导数的最小特征值&…

帧率和丢帧分析理论

一、丢帧问题概述 应用丢帧通常指的是在应用程序的界面绘制过程中&#xff0c;由于某些原因导致界面绘制的帧率下降&#xff0c;从而造成界面卡顿、动画不流畅等问题。以60Hz刷新率为例子&#xff0c;想要达到每秒60帧&#xff08;即60fps&#xff09;的流畅体验&#xff0c;每…

NLP 主要语言模型分类

文章目录 ngram自回归语言模型TransformerGPTBERT&#xff08;2018年提出&#xff09;基于 Transformer 架构的预训练模型特点应用基于 transformer&#xff08;2017年提出&#xff0c;attention is all you need&#xff09;堆叠层数与原transformer 的差异bert transformer 层…

1--SpringBoot外卖项目介绍及环境搭建 详解

目录 软件开发整体流程 软件开发流程 角色分工 软件环境 苍穹外卖项目介绍 项目介绍 产品原型 技术选型 开发环境搭建 前端环境搭建 后端环境搭建 完善登录功能 导入接口文档 Swagger 介绍 使用方式 常用注解 软件开发整体流程 软件开发流程 需求分析&#x…

Shiro-721—漏洞分析(CVE-2019-12422)

文章目录 Padding Oracle Attack 原理PKCS5填充怎么爆破攻击 漏洞原理源码分析漏洞复现 本文基于shiro550漏洞基础上分析&#xff0c;建议先看上期内容&#xff1a; https://blog.csdn.net/weixin_60521036/article/details/142373353 Padding Oracle Attack 原理 网上看了很多…

ElasticSearch-2-核心语法集群高可用实战-Week2

ES批量操作 1.批量获取文档数据 这里多个文档是指&#xff0c;批量操作多个文档&#xff0c;搜索查询文档将在之后的章节讲解 批量获取文档数据是通过_mget的API来实现的 (1)在URL中不指定index和type 请求方式&#xff1a;GET 请求地址&#xff1a;_mget 功能说明 &#…

【C++ Primer Plus习题】16.10

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: #include <iostream> #include <string> #include <…

java自定义线程池详解

目录 线程池使用线程池的目的线程池工作原理线程池常用方法自定义线程池等待队列拒绝策略线程工厂 线程池 使用线程池的目的 资源复用&#xff0c;降低开销。重复利用已创建的线程&#xff0c;避免线程频繁地创建和销毁带来的性能开销。方便线程的可管理性。线程是稀缺资源&a…

【GVINS】

【GVINS】 1. GVINS的系统特点2. GVINS的融合导航存在问题3. GVINS的信号的组成4. GVINS的信号的组成 原理推导知乎 1. GVINS的系统特点 概述了一种名为GVINS的系统&#xff0c;它旨在解决视觉-惯性里程计&#xff08;VIO&#xff09;在长时间运行时出现的漂移问题。GVINS通过…

三菱变频器Modbus-RTU 通讯规格

能够从变频器的 RS-485 端子使用 Modbus-RTU 通讯协议&#xff0c;进行通讯运行和参数设定。 NOTE: 1、使用 Modbus-RTU 通讯协议时&#xff0c;请设定Pr.549 协议选择 “1” 2、从主机按地址0(站号0)进行hodbus-RTU通讯时&#xff0c;为广播通讯&#xff0c;变频器不向主机发…

软件设计画图,流程图、甘特图、时间轴图、系统架构图、网络拓扑图、E-R图、思维导图

目录 一、流程图 二、甘特图 三、时间轴图 四、系统架构图 五、网络拓扑图 六、E-R图 七、思维导图 一、流程图 是一种用符号表示算法、工作流或流程的图形。用不同的图形表示不同含义&#xff0c;如椭圆表示开始和结束、菱形表示判断等。 画图工具WPS office 应用市场…

idea启动oom了解决

解决 Error:java: java.lang.OutOfMemoryError: WrappedJavaFileObject[org.jetbrains.jps.javac.InputFileObject[file:///D:/mingan/pb/backend/src/main/java/com/cy/backend/service/impl/StorageServiceImpl.java]]pos36199: WrappedJavaFileObject[org.jetbrains.jps.j…

松材线虫目标检测数据集,12522张图-纯手工标注

松材线虫目标检测数据集&#xff0c;12522张图像&#xff0c;专家纯手工标注。 松材线虫目标检测数据集 数据集描述 该数据集是一个专门用于松材线虫&#xff08;Bursaphelenchus xylophilus&#xff09;检测的数据集&#xff0c;旨在帮助研究人员和开发者训练和评估基于深度…