CUDA C编程及GPU基本知识【二】

news2025/1/11 1:43:36

文章目录

      • 1、CPU和GPU的架构
      • 2、CPUs: 延迟导向设计和GPUs: 吞吐导向设计
        • 2.1 CPUs: 延迟导向设计
        • 2.2 GPUs: 吞吐导向设计
        • 2.3 GPU&CPU特点
        • 2.4 GPU编程:什么样的问题适合GPU
      • 3、GPU编程与CUDA
        • 3.1 CUDA编程并行计算整体流程
        • 3.2 CUDA编程术语
          • 3.2.1 硬件
          • 3.2.2 内存模型
          • 3.2.3 软件
          • 3.2.4 线程块:可扩展的集合体
          • 3.2.5 网格(grid):并行线程块组合
          • 3.2.6 线程块id&线程id:定位独立线程的门牌号
            • 3.2.6.1 线程id计算
          • 3.2.7 线程束(warp )
      • 4、 并行计算实例:向量相加

1、CPU和GPU的架构

吞吐:单位时间内处理的指令条数
延迟:一条指令从发出到返回结果所需要的时间

在这里插入图片描述

2、CPUs: 延迟导向设计和GPUs: 吞吐导向设计

2.1 CPUs: 延迟导向设计

处理运算的速度远高于存储访问的速度,以空间换时间的方式,所以CPU设计了这种多级缓存的结构。

在这里插入图片描述

2.2 GPUs: 吞吐导向设计

在这里插入图片描述

2.3 GPU&CPU特点

在这里插入图片描述

2.4 GPU编程:什么样的问题适合GPU

计算密集:数值计算的比例要远大于内存操作,因此内存访问的延时可以被计算掩盖。
数据并行:大任务可以拆解为执行相同指令的小任务,因此对复杂流程控制的需求较低。

3、GPU编程与CUDA

CUDA(Compute Unified Device Architecture),由英伟达公司2007年开始推出,初衷是为GPU增加一个易用的编程接口,让开发者无需学习复杂的着色语言或者图形处理原语。

OpenCL(Open Computing Languge)是2008年发布的异构平台并行编程的开放标准,也是一个编程框架。OpenCL相比CUDA,支持的平台更多,除了GPU还支持CPU、DSP、FPGA等设备。

3.1 CUDA编程并行计算整体流程

1个CUDA程序可以分为3个步骤,第一个步骤是从主机端(CPU)申请内存,然后再把主机中内存的内容拷贝到设备端(GPU),第二个步骤是设备端的核函数进行计算,第三个步骤是把设备端内存的内容拷贝到主机,最后释放显存和内存。

在这里插入图片描述

3.2 CUDA编程术语

3.2.1 硬件

Device=GPU
Host=CPU
Kernel=GPU上运行的函数

在这里插入图片描述

3.2.2 内存模型

CUDA模型最基本的单位是线程处理器(SP)
多个线程处理器(SP)和一个shared memory(共享内存)构成一个多核处理器(SM),多个线程处理器(SP)之间是并行运行的
多个多核处理器(SM)和一个global memory(全局内存)构成一个GPU,多个多核处理器(SM)之间是并行运行的

在这里插入图片描述

3.2.3 软件

在这里插入图片描述

3.2.4 线程块:可扩展的集合体

线程:内存模型在软件侧最基本的执行单位
线程块:线程的组合体;有3个特点:1、线程块内的所有线程各自独立计算和访问存储,2、线程块内的共享内存可以被线程块内的所有线程所共享,3、用一个共有的时钟来去将线程块内的所有线程来进行一个同步和原子操作,进而保障线程块内所有线程的同步性。

如下图,一个线程块由256个线程所组成,各个线程独立计算,最后由一个时钟来将256个线程独立计算的结果进行同步

在这里插入图片描述

3.2.5 网格(grid):并行线程块组合

网格定义:线程块的组合体
网格也有3个特点:1、网格内的线程块彼此独立,互不影响,2、网格中的全局内存可以由各个线程块访问,3、可以用一个公有的时钟来同步网格内的所有线程块

在这里插入图片描述

3.2.6 线程块id&线程id:定位独立线程的门牌号

核函数是在设备端执行的函数,内存模型一个非常关键的一点是内存和显存之间的拷贝,当核函数调用每个线程的寄存器和局部内存的时候,需要确定线程在显存中的位置

blockIdx:线程块索引,
threadIdx:线程索引,
如下图,Grid 1是网格,是由2x2个线程块(Block)组成,每个线程块(Block)是由2x4x2个线程组成

在这里插入图片描述

3.2.6.1 线程id计算

如下图,Grid 1是由2x2个Block组成,所以M为2,N也为2;每个Block是由4x2x2个Thread组成,所以P为4,Q为2,S为2

threadId.x:线程x的索引,它等于线程块x维度的索引乘以线程块x维度的大小,再加上线程x维度的索引; 以此类推threadId.y

在这里插入图片描述

3.2.7 线程束(warp )

在这里插入图片描述

4、 并行计算实例:向量相加

在这里插入图片描述

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

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

相关文章

Hive分桶

分桶的概述 为什么要分桶 数据分区可能导致有些分区数据过多,有些分区数据极少。分桶是将数据集分解为若干部分(数据文件)的另一种技术。分区和分桶其实都是对数据更细粒度的管理。当单个分区或者表中的数据越来越大,分区不能细粒度的划分数据时&#x…

阐述说明NLP发展历史,以及 NLP与chatgpt的关系

自然语言处理(Natural Language Processing,NLP)是人工智能(AI)领域的一个重要分支,关注计算机与人类(自然)语言之间的交互。NLP的目标是使计算机能够理解、生成和解释自然语言&…

心法利器[89] | 实用文本生成中的解码方法

心法利器 本栏目主要和大家一起讨论近期自己学习的心得和体会,与大家一起成长。具体介绍:仓颉专项:飞机大炮我都会,利器心法我还有。 2022年新一版的文章合集已经发布,累计已经60w字了,获取方式看这里&…

[CVPR‘23] PanoHead: Geometry-Aware 3D Full-Head Synthesis in 360 deg

论文|项目 总结: 任务:3D human head synthesis现有问题:GANs无法在「in-the-wild」「single-view」的图片情况下,生成360度人像解决方案:1)提出了two-stage self-adaptive image alignment&am…

C++ 设计模式之策略模式

文章目录 一、简介二、场景三、举个栗子四、小结参考资料 一、简介 策略模式的定义很简单:即创建一系列的算法,把它们一个个封装起来 , 并且使它们可相互替换(用扩展的方式来面对未来变化)。在GoF一书中将其定位为一种“对象行为式模式”&…

vs code insiders 配置c语言

vs code insiders 配置c语言 1.下载插件 2.再配置代码 (1)launch.json {// Use IntelliSense to learn about possible attributes.// Hover to view descriptions of existing attributes.// For more information, visit: https://go.microsoft.com/…

操作系统的可扩展访问控制

访问控制是操作系统安全的基石,当前的操作系统已部署了很多访问控制的模型:Unix和Windows NT多用户安全;SELinux中的类型执行;反恶意软件产品;Apple OS X,Apple iOS和Google Android中的应用沙盒&#xff1…

RNN介绍

时间序列的表示 [seq_len, batch_size, vec ] seq_len表示一个句子通常有多少个单词或者一个序列有多少个时间段,batch_size表示同时多个样本,vec表示单词的编码长度 请问rnn和lstm中batchsize和timestep的区别是什么? - 知乎 (zhihu.com) import torch import torch.nn …

MYSQL05高级_查看修改存储引擎、InnoDB和MyISAM对比、其他存储引擎介绍

文章目录 ①. 查看、修改存储引擎②. InnoDB和MyISAM对比③. Archive引擎 - 归档④. Blackhole引擎丢数据⑤. CSV - 引擎⑥. Memory引擎 - 内存表⑦. Federated引擎 - 访问远程表⑧. Merge引擎 - 管理多个MyISAM⑨. NDB引擎 - 集群专用 ①. 查看、修改存储引擎 ①. 查看mysql提…

Spring Boot原理分析(一):项目启动(上)——@SpringBootApplication

文章目录 〇、准备工作一、SpringBootApplication.java源码解析1.源码2.自定义注解3.组合注解4.注解ComponentScan过滤器 5.注解SpringBootConfigurationConfiguration 6.注解EnableAutoConfiguration 本文章是Spring Boot源码解读与原理分析系列博客的第一篇,将会介…

Mac(M1Pro)下运行ChatGLM2

最近很多人都尝试在M1/M2芯片下跑chatglm/chatglm2,结果都不太理想,或者是说要32G内存才可以运行。本文使用cpu基于chatglm-cpp运行chatglm2的int4版本。开了多个网页及应用的情况下(包括chatglm2),总体内存占用9G左右。chatglm2可…

PYTHON+YOLOV5+OPENCV,实现数字仪表自动读数,并将读数结果进行输出显示和保存

最近完成了一个项目,利用pythonyolov5实现数字仪表的自动读数,并将读数结果进行输出和保存,现在完成的7788了,写个文档记录一下,若需要数据集和源代码可以私信。 最后实现的结果如下: 项目过程 首先查阅文…

从单体到SpringBoot/SpringCloud微服务架构无感升级的最佳实践

目录导读 从单体到SpringBoot/SpringCloud微服务架构无感升级的最佳实践1. 业务背景2. 当前问题3. 升级方案3.1 架构设计4. 详细设计4.1 迁移阻碍4.2 解决思路 5. 实现过程5.1 认证兼容改造5.2 抽象业务流程5.2.1 抽象业务的思路5.2.2 抽象业务的抽象编码5.2.3 抽象业务的具体实…

BFF网关模式开发指南

BFF是近些年新衍生出来的一种开发模式,或者说是一种适配模式的系统,BFF全称为Backend OF Front意为后端的前端,为了适配微服务模式下前端后端系统接口调用混乱而出现的。在如今微服务盛行的趋势下,大型系统中划分出了数十个服务模…

前端优化的一些方向

对于浏览器来说,加载网页的过程可以分为两部分,下载文档并响应(5%左右),下载各种组件(95%左右)。 而对比大部分优秀网页来说下载文档(10%~ 20%),下载组件&…

23_7第一周LeetCode刷题回顾

目录 1. 两数之和2. 两数相加3.无重复字符的最长子串4.寻找两个正序数组的中位数5.最长回文子串6.N 形变换7.整数反转8.字符串转整数(atoi)9.回文数10. 正则表达式匹配11. 盛最多水的容器12. 整数转罗马数字13. 罗马数字转整数14. 最长公共前缀15.三数之…

MyBatis中的动态SQL(sql标签、where标签、set标签、批量增加与批量删除)

目录 sql标签 ​编辑 where标签 set标签 foreach标签 批量增加 批量删除 将基础SQL语句中重复性高的增加它的复用性&#xff0c;使得sql语句的灵活性更强 sql标签<sql> <sql id"text">select * from user</sql><select id"selectA…

如何在苹果商店发布App?

一、介绍 众所周知&#xff0c;苹果对于自家产品的安全问题十分重视&#xff0c;他们有严格的一套审核标准和流程&#xff0c;当我们想要在苹果商店发布一款App的时候就需要经过重重艰难险阻&#xff0c;克服不少繁杂的问题去完成这项工作。 另外有一点需要注意的是&#xff…

C语言库函数strcpy学习

strcpy是C语言的一个标准库函数&#xff1b; strcpy把含有\0结束符的字符串复制到另一个地址空间&#xff0c;返回值的类型为char*。 原型声明&#xff1a;char *strcpy(char* dest, const char *src); 头文件&#xff1a;#include <string.h> 和 #include <stdio.h&g…

领域驱动设计(三) - 快速开始 - 【3/3】事件风暴

使用DDD的最终目的是深入学习业务如何运作。然后基于学习试验、质疑、再学习和重建模的过程。过程中面临的最大挑战是如何快速学习&#xff0c;并且在保证学习质量的前提下压缩学习时间&#xff08;你的学习是需要公司付工资的&#xff09;。 事件风暴就是一种相对高效的分析工…