《CUDA C++ Programming Guide》第一章 CUDA介绍

news/2025/3/19 19:34:25/

第一章 CUDA介绍

1.1 使用GPUs的好处

在相同的价格和功耗范围内,图形处理器 GPU 比 CPU 提供了更高的指令吞吐量和内存带宽, 许多应用程序利用这些更高的功能在 GPU 上比在 CPU 上运行得更快。相比较其他计算设备,如 FPGA,也是非常节能的,但其提供了比 GPU 少得多的编程灵活性。

GPU 和 CPU 之间的这种性能差异之所以存在,是因为它们在设计时考虑到了不同的目标。CPU 被设计成能够尽可能快地执行一系列操作(称为线程) ,并且能够并行地执行几十个这样的线程。GPU 被设计成能够并行执行数以千计的线程(缓冲较慢的单线程性能以获得更大的吞吐量)。

GPU专门用于高度并行的计算,因此设计成更多的晶体管用于数据处理而不是数据缓存和流量控制。示意图1显示了 CPU 芯片资源与 GPU 芯片资源的示例分布。

在这里插入图片描述
将更多的晶体管用于数据处理,例如浮点运算,有利于高度并行的计算;GPU 可以通过计算隐藏存储器访问延迟,而不需要依赖大型数据缓存和复杂的流控制来避免长的存储器访问延迟,因为这两者在晶体管方面都很昂贵。

一般来说,应用程序具有并行部分和顺序部分的混合,因此系统设计采用 GPU 和 CPU 的混合,以最大限度地提高整体性能。具有高度并行性的应用程序可以利用图形处理器的这种大规模并行处理机特性来获得比 CPU 更高的性能。

1.2 CUDA: 一个通用的并行计算平台和编程模型

2006年11月,NVIDIA 推出了 CUDA,这是一个通用的并行计算平台和编程模型,利用 NVIDIA 图形处理器中的并行计算引擎,以比 CPU 更有效的方式解决许多复杂的计算问题。

CUDA 提供了一个软件环境,允许开发人员使用 C + + 作为高级语言。同时也支持其他语言、应用程序编程接口或基于指令的方法,如 FORTRAN、 DirectCompute、 OpenACC。

在这里插入图片描述

1.3可伸缩编程模型

多核 CPU 和多核 GPU 的出现意味着主流处理器芯片现在是并行系统。挑战在于开发能够透明地扩展其并行性的应用软件,以利用不断增长的处理器核心数量,就像3D图形应用程序能够透明地扩展其并行性以适应多个核心数量差异很大的GPU一样

CUDA 并行编程模型旨在克服这一挑战,同时为熟悉 C 等标准编程语言的程序员保持较低的学习曲线。

其核心是三个关键的抽象ーー线程组的层次结构、共享内存和障碍同步ーー这些抽象只是作为最小的语言扩展集向程序员公开。

这些抽象提供了细粒度的数据平行和线程并行性,嵌套在粗粒度的数据平行和任务并行中。它们指导程序员将问题划分为可以通过线程块独立并行解决的粗粒子问题,并将每个子问题划分为可以通过块内所有线程并行协作解决的更细粒子问题。

这种分解通过允许线程在解决每个子问题时进行协作来保持语言的表达能力,同时支持自动伸缩性。事实上,每个线程块都可以在 GPU 中任何一个可用的多处理器上以任意顺序进行调度,并发或顺序执行,这样一个编译后的 CUDA 程序就可以在任意数量的多处理器上执行,而且只有运行时系统需要知道物理多处理器的数量。

这种可伸缩的编程模型允许 GPU 架构通过简单地缩放多处理器和内存分区的数量来跨越广泛的市场范围:从高性能的 GeForce 图形处理器和专业的 Quadro 和 Tesla 计算产品到各种廉价的主流 GeForce 图形处理器

在这里插入图片描述
GPU 是围绕流式多处理器(SM)阵列构建的。一个多线程程序被划分成多个独立执行的线程块,因此,一个具有更多处理器的 GPU 执行该程序的时间少于一个具有更少处理器的 GPU

1.4 CUDA 开发文件架构

本说明文档分为以下几节: (以下章节陆续会在CUDA专栏更新)

  1. 介绍:对 CUDA 的一般介绍(本章)
  2. 编程模型:概述CUDA 编程模型
  3. 编程接口:描述了编程接口
  4. 硬件实现:描述了硬件实现
  5. 性能指南:如何实现最佳性能提供了一些指导
  6. 启用 CUDA 的 GPU: 列出了所有启用 CUDA 的设备
  7. C + + 语言扩展:对 C + + 语言的所有扩展的详细描述
  8. 协作组:描述了各组 CUDA 线程的同步原语
  9. CUDA 动态并行性:描述了如何从一个内核启动并同步另一个内核
  10. 虚拟内存管理:描述了如何管理统一的虚拟地址空间
  11. 流有序内存分配器:描述了应用程序如何进行内存分配和释放
  12. 图形内存节点:描述了图形如何创建和拥有内存分配
  13. 数学函数:列出了 CUDA 支持的数学函数
  14. C + + 语言支持:列出了设备代码中支持的 C + + 特性
  15. 纹理获取:提供了更多关于纹理获取的细节
  16. 计算能力:给出了各种设备的技术规范,以及更多的体系结构细节
  17. 驱动程序 API: 引入了底层驱动程序 API
  18. CUDA 环境变量:列出了所有的 CUDA 环境变量
  19. 统一内存编程:引入了统一内存编程模型

当 GPU 最初被创建的时候,二十年前,它被设计成一个专门的处理器来加速图形渲染。由于市场对实时、高清、3D 图形的需求无法满足,它已经发展成为一种通用处理器,用于更多的工作负载,而不仅仅是图形渲染。


http://www.ppmy.cn/news/981002.html

相关文章

react经验4:动态组件

什么是动态组件&#xff1f; 在页面的一小块区域切换显示不同的组件 实现方法 1.声明示例组件 //写在component1.tsx中 const Component1()>{return (<div>组件1</div>) } //写在component2.tsx中 const Component2()>{return (<div>组件2</div…

(转载)PID神经元网络解耦控制算法(matlab实现)

​本博客的完整代码获取&#xff1a;https://www.mathworks.com/academia/books/book106283.html​ 1案例背景 1.1PID 神经元网络结构 PID神经元网络从结构上可以分为输人层、隐含层和输出层三层&#xff0c;n个控制量的PID神经元网络包含n个并列的相同子网络,各子网络间既相…

flask中redirect、url_for、endpoint介绍

flask中redirect、url_for、endpoint介绍 redirect 在 Flask 中&#xff0c;redirect() 是一个非常有用的函数&#xff0c;可以使服务器发送一个HTTP响应&#xff0c;指示客户端&#xff08;通常是浏览器&#xff09;自动导航到新的 URL。基本上&#xff0c;它是用来重定向用…

【C++】深入剖析list

本期我们来深入list的实现原理&#xff1a; 目录 一、STL中的list 二、list的模拟实现 2.1 搭建list的框架 2.2 list迭代器的实现 2.2.1 普通迭代器的实现 2.2.2 const类型迭代器的实现 2.2.3 迭代器中->运算符重载实现 2.3 其他功能函数的实现 2.3.1 insert 2.…

【论文阅读】A Comprehensive Survey

论文来源&#xff1a;Li M , Liu Y , Liu X ,et al.The Deep Learning Compiler: A Comprehensive Survey[J]. 2020.DOI:10.1109/TPDS.2020.3030548. 这是一篇关于深度学习编译器的综述类文章。 什么是深度学习编译器 深度学习&#xff08;Deep Learning&#xff09;编译器将…

在nginx上部署nuxt项目

先安装Node.js 我安的18.17.0。 安装完成后&#xff0c;可以使用cmd&#xff0c;winr然cmd进入&#xff0c;测试是否安装成功。安装在哪个盘都可以测试。 测试 输入node -v 和 npm -v&#xff0c;&#xff08;中间有空格&#xff09;出现下图版本提示就是完成了NodeJS的安装…

Scaling Instruction-Finetuned Language Models

Paper name Scaling Instruction-Finetuned Language Models Paper Reading Note Paper URL: https://arxiv.org/pdf/2210.11416.pdf TL;DR 2022 年谷歌出的文章&#xff0c;对指令微调的影响因素进行分析&#xff0c;提出了一些提升指令微调效果的方案。与该文章一起出品…

时序预测 | MATLAB实现BiLSTM时间序列未来多步预测

基本介绍 双向LSTM或biLSTMQ是一种序列处理模型,由两个LSTM组成:一个在前向接收输入,另个在后向接收输入。BiLSTMs有效地增加了网络可用的信息量。利用LSTM对句子进行建模还存在一个问题:无法编码从后到前的信息。在更细粒度的特征挖掘时缺乏能力,通过BiLSTM可以更好的捕…