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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DesignMode__unity__抽象工厂模式在unity中的应用、用单例模式进行资源加载

目录 抽象工厂模式 思维导图 接口&#xff08;抽象类&#xff09; 工厂接口 抽象产品类 抽象武器接口 抽象人物接口 具体工厂和具体产品 具体工厂 &#xff08;1&#xff09;产品接口&#xff0c;生成具体人物 &#xff08;2&#xff09;武器接口&#xff0c;生成具体…

vue3 vxe-grid 通过数据库返回的列信息,生成columns,并且其中有一列是img类型,进行slots的格式化处理。

1、一般我们写死的列信息的时候&#xff0c;会这样定义&#xff1a; 2、然后我们在template里面&#xff0c;这样这样写slots格式化部分&#xff1a; 这样表格中就会展示出一张图片&#xff0c;并且&#xff0c;我们点击了可以查看大图。 3、那么我们从数据库中返回的列&#…

maxwell 输出消息到 kafka

文章目录 1、kafka-producer2、运行一个Docker容器&#xff0c;该容器内运行的是Zendesk的Maxwell工具&#xff0c;一个用于实时捕获MySQL数据库变更并将其发布到Kafka或其他消息系统的应用3、进入kafka容器内部4、tingshu_album 数据库中 新增数据5、tingshu_album 数据库中 更…

RHCS认证-Linux(RHel9)-Ansible

文章目录 一、ansible 简介二 、ansible部署三、ansible服务端测试四 、ansible 清单inventory五、Ad-hot 点对点模式六、YAML语言模式七、RHCS-Ansible附&#xff1a;安装CentOS-Stream 9系统7.1 ansible 执行过程7.2 安装ansible&#xff0c;ansible-navigator7.2 部署ansibl…

Docker UI强大之处?

DockerUI是一款由国内开发者打造的优秀Docker可视化管理工具。它拥有简洁直观的用户界面&#xff0c;使得Docker主机管理、集群管理和任务编排变得轻松简单。DockerUI不仅能展示资源利用率、系统信息和更新日志&#xff0c;还提供了镜像管理功能&#xff0c;帮助用户高效清理中…

清华大学开源视频转文本模型——CogVLM2-Llama3-Caption

通常情况下&#xff0c;大多数视频数据并不附带相应的描述性文本&#xff0c;因此有必要将视频数据转换为文本描述&#xff0c;为文本到视频模型提供必要的训练数据。 CogVLM2-Caption 是一个视频字幕模型&#xff0c;用于为 CogVideoX 模型生成训练数据。 文件 使用 import i…

计算机毕业设计 校运会管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

青柠视频云——如何开启HTTPS服务?

前言 由于青柠视频云的语音对讲会使用到HTTPS服务&#xff0c;这里我们说一下如何申请证书以及如何在实战中部署并且配置使用。 一、证书申请 1、进入控制台 我们拿阿里云的免费个人证书为例&#xff0c;首先登录阿里云&#xff0c;在控制台找到数字证书管理服务&#xff0c;进…

音视频入门基础:FLV专题(4)——使用flvAnalyser工具分析FLV文件

一、引言 有很多工具可以分析FLV格式&#xff0c;这里推荐flvAnalyser。其支持&#xff1a; 1.FLV 文件分析&#xff08;Tag 列表、时间戳、码率、音视频同步等&#xff09;&#xff0c;HEVC(12)/AV1(13) or Enhanced RTMP v1 with fourCC(hvc1/av01)&#xff1b; 2.RTMP/HTT…

Linux突发网络故障常用排查的命令

测试环境 系统&#xff1a;Ubuntu 18硬件&#xff1a;单核2G ping 用于测试客户机和目标主机通信状况&#xff0c;是否畅通。以及测量通信的往返时间&#xff0c;判断网络质量的好坏。 它通过发送ICMP回显请求消息到目标主机&#xff0c;并等待返回的ICMP回显回复消息。 pin…

DeiT:Data-efficient Image Transformer(2020),基于新型蒸馏的ViT

Training data-efficient image transformers & distillation through attention&#xff1a;通过注意力训练数据高效的图像转换器和蒸馏 论文地址&#xff1a; https://arxiv.org/abs/2012.12877 代码地址&#xff1a; https://github.com/facebookresearch/deit 这篇论文…

k8s介绍-搭建k8s

官网&#xff1a;https://kubernetes.io/ 应用部署方式演变 传统部署&#xff1a;互联网早期&#xff0c;会直接将应用程序部署在物理机上 优点&#xff1a;简单&#xff0c;不需要其他技术的参与 缺点&#xff1a;不能为应用程序定义资源使用边界&#xff0c;很难合理地分配计…

简单的spring缓存 Cacheable学习

简单的spring缓存 Cacheable学习 1.需求 项目中有很多的方法查询的数据其实是不会经常变的&#xff0c;但是其整体的查询sql以及调用第三方数据获取数据花费的时间很长&#xff0c;现在考虑对此类型的接口进行优化&#xff0c;首先想到的是对其进行缓存操作&#xff0c;所以简…

CVE-2024-46103

前言 CVE-2024-46103 SEMCMS的sql漏洞。 漏洞简介 SEMCMS v4.8中&#xff0c;SEMCMS_Images.php的search参数&#xff0c;以及SEMCMS_Products.php的search参数&#xff0c;存在sql注入漏洞。 &#xff08;这个之前就有两个sql的cve&#xff0c;这次属于是捡漏了&#x1f6…

[vulnhub] Hackademic.RTB1

第一次打靶机&#xff0c;思路看的红队笔记 https://www.vulnhub.com/entry/hackademic-rtb1,17/ 环境&#xff1a;kali Linux - 192.168.75.131&#xff0c;靶机 - 192.168.75.132 主机发现和端口扫描 扫描整个网络有哪台机子在线&#xff0c;不进行端口扫描 nmap -sP 192.16…

JavaSE高级(3)——lombok、juint单元测试、断言

一、lombok的使用 默认jvm不解析第三方注解&#xff0c;需要手动开启 链式调用 二、juint单元测试 下载juint包 public class TestDemo {// 在每一个单元测试方法执行之前执行Beforepublic void before() {// 例如可以在before部分创建IO流System.out.println("befor…

力扣周赛 —— 416

前言 只做出了第一道&#xff0c;第二第三道都超时。 痛&#xff0c;太痛了。 题目 Q1.举报垃圾信息 给你一个字符串数组 message 和一个字符串数组 bannedWords。 如果数组中 至少 存在两个单词与 bannedWords 中的任一单词 完全相同&#xff0c;则该数组被视为 垃圾信息。…

HTML讲解(三)通用部分

目录 1.空格标记 2.特殊文字的标记 3.注释语句 4.对文字字体的设置 5.修改文字形态 6.换行标记 7.居中标记 8.水平线标记 9.设置滚动弹幕 1.空格标记 在HTML中&#xff0c;我们想打印空格并不能直接敲一个空格键&#xff0c;因为如果是敲空格键&#xff0c;那无论你敲…

【已解决】ElementPlus 的 el-menu 组件如何用 js 控制展开某个子菜单,并在其他组件中控制使用呢?

文章目录 需求几次探索官网寻找线索&#xff08;解决办法&#xff09; 需求 我如何用代码来实现 ElementPlus 的菜单的展开和收缩呢&#xff1f; 几次探索 尝试通过找到节点之后&#xff0c;使用 click 事件&#xff0c;失败了 // 伪代码如下 const handleFindNodeAndClick …

vue Echart使用

一、在vue中使用Echarts 1.安装Echarts npm install echarts --save2.准备一个呈现图表的盒子 给盒子起名字是建议使用id选择器 这个盒子通常来说就是我们熟悉的 div &#xff0c;这个 div 决定了图表显示在哪里&#xff0c;盒子一定要指定宽和高 <div id"main&quo…