cuda编程模型

  1. host和device:
    • host:即CPU,CPU所关联的内存就叫host memory
    • device:即GPU,GPU内的内存就叫device memory
    • 运行CUDA程序主要有三步:1)host-to-device transfer:将数据从host memory拷到device memory;2)加载GPU程序并执行,将数据缓存到on-chip上读取更快;3)device-to-host transfer:将device memory中的结果拷到host memory
  2. 【逻辑上】CUDA kernel:就是在GPU上执行的函数
    • start with a __global__ declaration specifier
    • a kernel is executed as a grid of blocks of threads
  3. 【物理上】一个CUDA block在一个SM(streaming multiprocessor)上执行;一个SM可以运行多个并发的CUDA block;一个kernel在一个deivce上执行,一个device上可以同时运行多个kernels。如下图是逻辑和硬件资源的映射关系:
    请添加图片描述
    • 其中,SM的基本执单元是包含32个线程的线程数,所以block大小一般设置为32的倍数
    • 每个线程都包含自己的指令地址计数器和寄存器状态,也有自己独立的执行路径。所以尽管一个warp中的线程同时从同一程序地址执行,但可能具有不同的行为。比如遇到了分支结构,一些线程可能进入这个分支,但另外一些可能并不用执行,只能进入死等(等待warp内其他未执行完的线程执行完毕),因为GPU规定线程束中所有线程在同一周期执行相同的指令,线程束分化会导致性能下降。
  4. CUDA中的index问题
    • 几个built-in变量:gridDim , blockDim用于指示自己的维度;blockIdx, threadIdx用于指示自己在上一层中是第几个。如下图的例子中:
      • gridDim.x=3(表示grid的x维度有3个blocks),gridDim.y=2(grid的y维度有2个blocks)
      • blockDim.x=4(表示block的x维度有4个threads),blockDim.y=3(表示block的y维度有3个threads)
      • blockIdx.x=0, blockIdx.y=1 表示的是 block(0, 1)
      • threadIdx.x=2, threadIdx.y=1表示的是 thread(2, 1)
        请添加图片描述
    • thread indexing: 为每个thread分配一个唯一的id
      • 1D grid of 1D blocks: threadId = blockIdx.x * blockDim.x + threadIdx.x
        请添加图片描述
      • 1D grid of 2D blocks: threadId = blockIdx.x * blockDim.x * blockDim * y + threadIdx.y * blockDim.x + threadIdx.x;
        请添加图片描述
      • 2D grid of 1D blocks: threadId = blockIdx.y * gridDim.x * blockDim.x + blockIdx.x * blockDim.x + threadIdx.x
        • blockId = blockIdx.y * gridDim.x + blockIdx.x
        • threadId = blockId * blockDim.x + threadIdx.x
          请添加图片描述
      • 2D grid of 2D blocks: threadId = blockIdx.y * gridDim.x * blockDim.x * blockDim.y + blockIdx.x * blockDim.x * blockDim.y + theadIdx.y * blockDim.x + threadIdx.x
        请添加图片描述
      • 总结:二维下,[小Id]就是[小Idx.y]*[大Dim.x]+[小Idx.x],即若位于第n行,前面就有n*上一级列数个,然后再加上是第几列(因为索引值从零开始,所以直接加即可)
  5. GPU存储
    在这里插入图片描述
    在这里插入图片描述
    上图中:
    L1/SMEM:指L1 cache/Shared memory,是每个SM独有的。Shared memory可以由用户写代码进行数据的读写控制,L1则不行;
    Read only:只读缓存;
    L2 Cache:所有SM都可以访问
    Global Memory:全局内存,是所有线程都能访问的内存,也是和CPU内存进行数据传递的地方。通常说的显存就是global memory
    请添加图片描述
    每个SM都拥有自己的shared memory,而这些SM们都位于同一块芯片上(on the same chip),这块芯片通过PCB电路连接内存芯片(DRAM)
    SP(cuda core、流处理器,一个thread占用一个SP)对shared memory的访问属于片上访问,可以立刻获得数据
    SP对内存芯片(DRAM)的访问需要通过请求内存控制器等一系列操作,然后才能得到数据。

    下图是一个速度问题:其中s、t、u是本地内存(local memory)中的变量,a、b、c是shared memory中的变量,所以t=s最快
    请添加图片描述
  6. __syncthreads()
    • 确保这行代码之前,同一个block内的所有线程都完成了各自的工作(如将数据从全局内存加载到了共享内存中)。只同步一个线程块中的线程,其他线程块不受影响

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

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

相关文章

Qt(简介)

1. Qt简介 Qt是一个基于C的图形用户界面(GUI)框架,可以开发可视化人机交互程序,但是这并不是Qt的全部。Qt除了可以绘制漂亮的界面外,还包含很多其他的功能:多线程、数据库、图像处理、音视频处理、网络通信…

Python画笔案例-085 绘制 3D效果文字

1、绘制3D效果文字 通过 python 的turtle 库绘制 3D效果文字,如下图: 2、实现代码 绘制 3D效果文字,以下为实现代码: """3D效果文字.py """ import turtle# 给Turtle类增加addx和addy方法 turtle.Turtle.addx = lambda self,dx

OpenUAV:首个专为现实无人机视觉语言导航设计的大规模轨迹数据集,由大约 12k 个轨迹组成,涵盖了多种环境和复杂的飞行动态。

2024-10-10,由北京航空航天大学人工智能研究所、香港中文大学MMLab以及感知与交互智能中心共同创建了OpenUAV数据集,首个专为现实无人机(UAV)视觉语言导航(VLN)任务设计的大型轨迹数据集,该数据…

2023年云南省职业院校技能大赛(网络建设与运维赛项)

2023年云南省职业院校技能大赛 “网络搭建与应用”赛项样题 2023年8月 竞赛说明 一、竞赛内容分布 “网络搭建与应用”竞赛共分三个部分,其中: 第一部分:网络理论测试(100分) 第二部分:网络建设与调试&…

精准管理知识资产:十大内部知识库工具全解析

在当今竞争激烈的市场环境中,知识资产已成为企业核心竞争力的重要组成部分。为了更好地管理和利用这些宝贵的知识资源,选择合适的内部知识库工具至关重要。本文将为您介绍十款高效、实用的内部知识库工具,帮助您实现知识资产的精准管理。 1.…

SldWorks问题 2. 矩阵相关接口使用上的失误

问题 在计算三维点在图纸(DrawingDoc)中的位置时,就是算不对,明明就4、5行代码,怎么看都是很“哇塞”的,毫无问题的。 但结果就是不对。 那就调试一下吧,调试后发现生成的矩阵很不对劲&#…

架构设计笔记-15-面向服务架构设计理论与实践

目录 知识要点 案例分析 1.微服务架构 2.微服务 3.微服务架构 4.SOA与微服务 5.基于微服务架构的系统/传统单体式系统 论文 1.论微服务架构及其应用 知识要点 服务组件体系结构(Service Component Architecture,SCA)是面向服务体系…

重头开始嵌入式第四十九天(Linux内核驱动 内核编译 向内核添加新文件)

目录 内核编译: 什么是uImage? 一、产生背景 二、主要特点 三、使用方式 uImage与zImage与Image的区别? 向内核添加新驱动文件: 内核编译: 什么是uImage? uImage 是一种用于嵌入式系统的 Linux 内核…

windows安装deepspeed setup.py 207行找不到文件

一直报莫名奇妙的错误,查了半天也没查到 去看了一下源码,需要安装git,我没有安装 git命令获得信息也没啥用 直接注释掉 成功运行

高效管理知识资产:十大内部知识库软件一览

在当今竞争激烈的市场环境中,知识资产已成为企业核心竞争力的重要组成部分。为了更好地管理和利用这些宝贵的知识资源,选择合适的内部知识库工具至关重要。本文将为您介绍十款高效、实用的内部知识库工具,帮助您实现知识资产的精准管理。 1.…

【argparse】 菜鸟实用教程指南

文章目录 0. 引言1. argparse简介2. argparse的使用3. 实例操作4. 代码运行4.1 命令行执行4.1 IDE执行 5. 总结 0. 引言 在深度学习的过程中,我们常常需要操作和调参大量的参数。如果采用硬编码(直接在代码中赋值)的方式来设置这些参数&…

补充面试知识点

jwt鉴权 实现登录流程 jwt鉴权登录实现步骤(JWT工具类拦截器前端配置)——前后端鉴权方案和使用_jwtsigner-CSDN博客 就是前端每一次刷新页面的时候 都判断一下发来的请求头里边的token信息 通过token识别用户信息和登录状态也就是id 线程池的执行流程 …

【安当产品应用案例100集】022-阿里云、腾讯云、华为云等公有云上ECS服务器中数据加密保护方案

企业业务上云后,在云上进行数据加密保护的必要性主要体现在以下几个方面: 一、保护敏感数据 企业存储在云上的数据可能包含客户信息、财务数据、知识产权等敏感信息。这些数据一旦泄露或被滥用,将对企业造成严重的法律和道德责任问题。通过…

pico+Unity交互开发——触碰抓取

一、VR交互的类型 Hover(悬停) 定义:发起交互的对象停留在可交互对象的交互区域。例如,当手触摸到物品表面(可交互区域)时,视为触发了Hover。 Grab(抓取) 概念&#xff…

SQLServer-ASYNC_NETWORK_IO等待事件

文章目录 客户端应用程序出现问题网络问题 ASYNC_NETWORK_IO 是一种经常被DBA看到的等待类型,当其数值过高时可能会让人担忧,因为这是最难解决的等待类型之一。 需要知道的是,从 SQL Server 2005 开始,这种等待类型被命名为 ASYNC…

Android Compose使用LinearProgressIndicator绘制显示异常

使用依赖版本 androidx.compose.material3:material3:1.3.0-beta05 对应代码 LinearProgressIndicator(progress { 0.7f })直接使用上述代码绘制进度条时,最终显示效果如下: 问题原因 LinearProgressIndicator中gapSize属性表示进度和背景之前的空…

00 springboot项目创建

我们创建SpringBoot项目有两种方式: Spring Initializr spring initerzie 方式创建: 启动类, 依赖 生成,但是需要网络maven的方式 maven方式创建: 启动类, 依赖, 这些都需要手动编写,但是不需要网络 springboot系列,最近持续更新中,如需要请关注 如果…

RTSP RTP RTCP SDP基础知识

理论 流(Streaming ) 是近年在 Internet 上出现的新概念,其定义非常广泛,主要是指通过网络传输多媒体数据的技术总称。 流式传输分为两种 顺序流式传输 (Progressive Streaming) 实时流式传输 (Real time Streaming) ​​​​​…

Mybatis全局配置介绍

【mybatis全局配置介绍】 mybatis-config.xml,是MyBatis的全局配置文件,包含全局配置信息,如数据库连接参数、插件等。整个框架中只需要一个即可。 1、mybatis全局配置文件是mybatis框架的核心配置,整个框架只需一个&#xff1b…

Go 项目如何集成类似mybatisPlus插件呢?GORM走起!!

导读: 在 Go 项目中,虽然没有像 MyBatis Plus 这样特定的 ORM 插件,但可以使用功能相似的 Go ORM 框架,比如 GORM,它支持链式查询、自动迁移、预加载等功能,与 MyBatis Plus 有相似之处。通过一些插件或扩…