当前位置: 首页 > news >正文

CUDA中的基本概念

要学习cuda的同学相信已经对其有一定的了解了,至少直到它是干什么的了。这篇文章主要是对cuda编程中的主要概念进行总结,有了一个大致的轮廓后就好入手了。

异构架构

异构架构即使用CPU和GPU共同进行计算。GPU不能作为一个独立的运行平台(程序无法单独在GPU上运行),它只能作为CPU的一个附属计算加速器。
在这里插入图片描述
上图展示了异构架构中CPU和GPU的关系。CPU和GPU通过PCIe总线进行数据传输。在碰到计算密集型任务时,CPU将数据传给GPU,GPU计算完成后再传输回CPU。
从上述架构途中也可看出,GPU上有更多的算术逻辑单元,计算能力更强。

主机(host)和设备(device)

由于CPU和GPU的这种从属关系,CPU所在的位置被称为主机端(host),GPU所在位置被称为设备端(device)。在cuda编程中,主机端代码和设备端代码是有严格区分的。核函数的代码只能在GPU上运行。

CUDA中的线程和一般的多线程有什么区别

CPU上的线程是重量级的,上下文切换缓慢且开销较大, 且线程数量往往有限。CPU的线程相对于GPU的线程更适合处理控制密集型任务(多个if-else).
GPU上的线程是轻量级的。现代GPU上可以同时有成千上万个线程并发。GPU的线程更适合控制简单,但是计算密集的任务。

流式多处理器,线程束

GPU架构是围绕流式多处理器(SM)展开的, GPU上有很多个SM,每个SM能够支持数百个线程并发执行,因此在一个GPU上并发执行数千个线程是很容易的。下图所示为一个SM的关键组件(了解即可):
在这里插入图片描述
每个SM上有多个线程,每32个线程被组织成一个线程束(thread wrap)。

线程网格,线程块

线程束是物理上线程的划分,但是在cuda编程中,逻辑上更多地是将线程分为不同的线程块(thread block),不同的线程块又分到不同的线程网格(thread grid)中。在编程中,每个在GPU上运行的核函数都要指定线程块和线程网格的维度。线程块和线程网格的维度都可以是一维二维或者三维。

  • 区分线程块和线程束
    线程束表示的是线程资源。一个线程块可能会占用多个线程束。假设在编程中指定一个线程块中有80个线程,那么这个线程块将占用3个线程束,多出来的线程束将不会活跃,如下图所示:
    在这里插入图片描述
    多个线程块在一起将会被组织成网格。
    好了,上述就是几个比较重要的概念,后面将直接通过代码来学习cuda。
http://www.xdnf.cn/news/1302193.html

相关文章:

  • Scikit-learn (sklearn) 库详细介绍
  • 869. 重新排序得到 2 的幂
  • iSCSI 服务详解:配置与远程存储
  • 「iOS」————UITableView性能优化
  • PaddleOCR从小红书视频中提取字幕并生成思维导图
  • VUE+SPRINGBOOT从0-1打造前后端-前后台系统-一分钟音频转文字
  • Spring WebFlux 性能优化实践指南
  • 金融项目高可用分布式TCC-Transaction(开源框架)
  • 基于RobustVideoMatting(RVM)进行视频人像分割(torch、onnx版本)
  • 力扣 —— 二分查找
  • [优选算法专题二滑动窗口——无重复字符的最长子串]
  • docker 安装 使用
  • QT在Widget类下的四种QPushbutton的信号与槽的连接方式
  • Python中推导式和表达式
  • QT(事件)
  • 【机器学习深度学习】客观评估训练程度
  • AIoT浪潮之巅:AI如何赋能边缘物联网,解锁三大核心潜能
  • Spring中存在两个相同的Bean是否会报错?
  • Java 大视界 -- Java 大数据在智能教育虚拟学习环境构建与学习体验增强中的应用(399)
  • STM32F103C8T6学习——直接存储器访问(DMA)标准库实战3(ADC数据采集+DMA回传)
  • 开始回溯的学习
  • I/O多路复用特性与实现
  • 【学习嵌入式day-25-线程】
  • 扣子(Coze),开源了!Dify 天塌了
  • 无人机智能跟踪模块设计与运行分析
  • Mac Mysql 卸载
  • 【Docker】openEuler 使用docker-compose部署gitlab-ce
  • C++设计模式:类间关系
  • 企业级时序数据库选型指南:从传统架构向智能时序数据管理的转型之路
  • Flinksql bug: Heartbeat of TaskManager with id container_XXX timed out.