CUDA并行架构

news2024/9/21 7:35:39

一、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中执行的。

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

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

相关文章

使用LangGPT提示词让大模型比较浮点数

使用LangGPT提示词让大模型比较浮点数 背景介绍环境准备创建虚拟环境安装一些必要的库安装其他依赖部署大模型启动图形交互服务设置提示词与测试 LangGPT结构化提示词 背景介绍 LLM在对比浮点数字时表现不佳&#xff0c;经验证&#xff0c;internlm2-chat-1.8b (internlm2-cha…

Excel-时间取整,工作有效时长计算

在计算考勤时&#xff0c;打卡时间不是整点&#xff0c;上班时间是遵循整点开始计算的&#xff0c;员工提前打卡&#xff0c;所以要用到时间向上取整。 上班取整&#xff1a; 使用CEILING函数可实现该需求&#xff0c;参考以下公式&#xff0c;第一个参数为上班打卡时间&#…

MySQL篇(窗口函数/公用表达式(CTE))(持续更新迭代)

目录 讲解一&#xff1a;窗口函数 一、简介 二、常见操作 1. sumgroup by常规的聚合函数操作 2. sum窗口函数的聚合操作 三、基本语法 1. Function(arg1,..., argn) 1.1. 聚合函数 sum函数&#xff1a;求和 min函数 &#xff1a;最小值 1.2. 排序函数 1.3. 跨行函数…

一文读懂SpringCLoud

一、前言 只有光头才能变强 认识我的朋友可能都知道我这阵子去实习啦&#xff0c;去的公司说是用SpringCloud(但我觉得使用的力度并不大啊~~)… 所以&#xff0c;这篇主要来讲讲SpringCloud的一些基础的知识。(我就是现学现卖了&#xff0c;主要当做我学习SpringCloud的笔记吧&…

英集芯IP5902:集成电压可调异步升压转换充电管理功能的8位MCU芯片

英集芯IP5902是一款集成了9V异步升压转换、锂电池充电管理及负端NMOS管的8-bit MCU芯片&#xff0c;外壳采用了SOP16封装形式&#xff0c;高集成度和丰富的功能使其在应用时只需很少的外围器件&#xff0c;就能有效减小整体方案的尺寸&#xff0c;降低BOM成本&#xff0c;为小型…

Vue使用axios实现Ajax请求

1、什么是 axios 在实际开发过程中&#xff0c;浏览器通常需要和服务器端进行数据交互。而 Vue.js 并未提供与服务器端通信的接口。从 Vue.js 2.0 版本之后&#xff0c;官方推荐使用 axios 来实现 Ajax 请求。axios 是一个基于 promise 的 HTTP 客户端。 关于 promise 的介绍…

C#开源的一个能利用Windows通知栏背单词的软件

前言 今天给大家推荐一个C#开源且免费的能利用Windows通知栏背单词的软件&#xff0c;可以让你在上班、上课等恶劣环境下安全隐蔽地背单词&#xff08;利用摸鱼时间背单词的软件&#xff09;&#xff1a;ToastFish。 操作系统要求 目前该软件只支持Windows10及以上系统&…

Scrapy爬虫实战——某瓣250

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

Linux系统查找文件的所属目录

在Linux下查找文件的所属目录方法较多&#xff0c;既可以在图形桌面系统中用搜索功能查找文件&#xff0c;也可以在字符终端窗口中用不同的命令查找不同类型文件并显示其所在目录&#xff0c;针对不同的文件类型&#xff0c;有不同的命令。 一、在图形桌面系统中查找 如图1&a…

利用 ARMxy边缘计算网关和 BLiotlink 软网关,实现工业智能化升级

在当今数字化、智能化的时代浪潮中&#xff0c;工业领域也在不断寻求创新与突破&#xff0c;以提高生产效率、降低成本并提升竞争力。ARM 工业计算机与 BLiotlink 协议转换软件的结合&#xff0c;为工业智能化带来了新的机遇和解决方案。 一、ARM 工业计算机的优势 ARM 工业计…

【4.4】图搜索算法-BFS和DFS两种方式解岛屿数量

一、题目 给你一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的的二维网格&#xff0c;请你计算网格中岛屿的数量。岛屿总是被水包围&#xff0c;并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。此外&#xff0c;你可以假设该网格的四条…

I2C中继器TCA9517A(TI)

一、芯片介绍 本芯片是一款具有电平转换功能的双向缓冲器&#xff0c;适用于I2C和SMBus系统&#xff0c;同时支持各种拓扑结构的扩展使用。芯片支持SCL和SDA缓冲&#xff0c;因此允许两条总线的负载电容达到400pF。 TCA9517A的A和B侧驱动器是不同的&#xff0c;但是均可耐受5…

Obsidian 全部笔记共享配置文件,obsidian仓库-文件夹配置统一化

obsidian仓库-文件夹配置统一化 在每次新建obsidian仓库(vaults)时&#xff0c;仓库的主题和快捷键等都需要重新设置&#xff0c;这是因为每次创建新的仓库时 新仓库的配置文件都是默认配置但是如果通过复制粘贴旧配置文件来达到新仓库的配置和旧仓库一致的话&#xff0c;无法…

kafka3.8的基本操作

Kafka基础理论与常用命令详解&#xff08;超详细&#xff09;_kafka常用命令和解释-CSDN博客 [rootk1 bin]# netstat -tunlp|grep 90 tcp6 0 0 :::9092 :::* LISTEN 14512/java [rootk1 bin]# ./kafka-topics.s…

MVCC机制解析:提升数据库并发性能的关键

MVCC机制解析&#xff1a;提升数据库并发性能的关键 MVCC&#xff08;Multi-Version Concurrency Control&#xff09; 多版本并发控制 。 MVCC只在事务隔离级别为读已提交(Read Committed)和可重复读(Repeated Read)下生效。 MVCC是做什么用的 MVCC是为了处理 可重复读 和…

数据安全治理

数据安全治理 1.数据安全治理2.终端数据安全加密类权限控制类终端DLP类桌面虚拟化安全桌面 3.网络数据安全4.存储数据安全5.应用数据安全6.其他话题数据脱敏水印与溯源 7.UEBA8.CASB 1.数据安全治理 数据安全治理最为重要的是进行数据安全策略和流程制订。在企业或行业内经常发…

酸枣病虫害智能化防控系统的探索与实践,基于YOLOv5全系列【n/s/m/l/x】参数模型开发构建枣类作物种植场景下酸枣病虫害智能检测识别系统

智慧农业&#xff0c;作为现代农业的高级形态&#xff0c;通过集成物联网、大数据、人工智能等先进技术&#xff0c;实现了农业生产过程的精准化、智能化管理。在酸枣等经济作物的种植过程中&#xff0c;病虫害的及时监测与防控直接关系到作物的产量与质量&#xff0c;进而影响…

Vue报错 ‘vite‘ 不是内部或外部命令,也不是可运行的程序或批处理文件

报错 vue-project0.0.0 dev vite‘vite’ 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。解决 第1步. 控制台输入 npm install -g create-vite第2步. 控制台输入 npm install -g vite第3步. 运行就ok啦

伊犁linux 创建yum 源过程

首先要创建yum 源这样后期的服务才能大面积部署 在su 用户下创建 清理缓存&#xff0c;一定要配置 这说明yum安装成功

笔记整理—内核!启动!—kernel部分(8)动态编译链接库与BSP文件

linux的C语言程序是用编译的&#xff0c;但是如果要在开发板上运行的话就不能使用默认的ubuntu提供的gcc编译器&#xff0c;而是使用arm-linux版本的一类的编译器。我们可以用file xx去查看一个程序的架构。 &#xff08;arm架构&#xff09; &#xff08;intel的80386架构&…