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 内核…

【网络安全】IDOR与JWT令牌破解相结合,实现编辑、查看和删除数万帐户

未经许可,不得转载。 文章目录 前言漏洞1漏洞2修复建议在今年4月17日,笔者发过一篇关于 JWT 的文章,未学习过或稍有遗忘的朋友可以点击跳转:【网络安全 | 密码学】JWT基础知识及攻击方式详析 现分享一篇与 JWT 有关的漏洞挖掘案例。 前言 我在某公共漏洞奖励计划的应用程…

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 线程池的执行流程 …

SpringCloud学习:Maven父工程创建、微服务工程化编写步骤(约定 > 配置 > 编码)

文章目录 1. Maven父工程创建2. Maven 父工程 DependencyManager 和子工程 Dependencies3. 微服务工程化编写步骤: **约定 > 配置 > 编码** 1. Maven父工程创建 1、创建一个新的工程;2、总父工程的名字;3、字符编码改为UTF-8&#xff…

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

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

Python与虚拟现实:使用Python构建简单的VR场景

解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 前言 虚拟现实(Virtual Reality, VR)作为一种沉浸式技术,近年来发展迅速。它不仅应用于游戏,还广泛用于医学模拟、建筑设计、教育培训等领域。通过VR,用户可以进入一个全新的虚拟世界,进行互动与体验。虽然…

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属性表示进度和背景之前的空…